Стандартные Контейнеры Библиотеки с дополнительными дополнительными шаблонными параметрами?

Красота многопоточности состоит в том, что Вы не знаете, в котором произойдут вещи порядка. При установке чего-то на одном потоке это могло бы произойти сначала, это могло бы произойти после получения.

код Вы отправили с блокировкой участника, в то время как это читается и пишется. Если Вы хотите обработать случай, где значение обновляется, возможно, необходимо изучить другие формы синхронизации, такой как события . (Проверьте автоматические / версии руководства). Затем можно сказать потоку "опроса", что значение изменилось, и это готово быть перечитанным.

25
задан Johannes Schaub - litb 24 September 2009 в 04:14
поделиться

4 ответа

Я нашел следующий отчет о проблеме , в котором говорится

Нет двусмысленности; стандарт ясен как написано. Разработчикам библиотеки не разрешается добавлять параметры шаблона в классы стандартной библиотеки. Это не подпадает под правило «как если бы», поэтому было бы разрешено, только если бы стандарт давал явную лицензию разработчикам на это. Это потребовало бы изменения в стандарте.

LWG решила не вносить это изменение, поскольку это нарушит пользовательский код, включающий параметры шаблона шаблона или специализации шаблонов классов стандартной библиотеки.

Книги и люди, которые говорят, что реализация может добавлять другие необязательные параметры, кажутся неправильными.

23
ответ дан 28 November 2019 в 21:46
поделиться

Incredibly, I was recently reading "C++ Templates: The Complete Guide," and last book marked the following on page 111:

A template template argument must be a class template with parameters that exactly match the parameters of the template template parameter it substitutes. Default template arguments of a template template argument are ignored (but if the template template parameter has default arguments, they are considered during the instantiation of the template).

So, if the book is to be believe, your example where non-standard default parameters are added to std::vector would be legal - since default template arguments of a template template argument are ignored.

As a real world test, I compiled the following in g++ (successfully) and Visual Studio 2008 (failed on the mismatched parameters):

template<typename T1, typename T2, typename T3 = float>
class MyClass
{
public:
    T1 v1;
    T2 v2;
    T3 v3;
};

template<template<typename T1, typename T2> class C>
void f()
{
    C<int,double> *c = new C<int,double>();
}

int main ()
{
    f<MyClass>();
    return 0;
}
2
ответ дан 28 November 2019 в 21:46
поделиться

Проверить подподразделы 17.4.4 [lib.conforming].

17.4.4.3/3 говорит, что «глобальная функция или функция, не являющаяся членом, не может быть объявлена ​​реализацией как принимающая дополнительное значение по умолчанию. arguments ", но 17.4.4.4/2 явно позволяет заменять описанные сигнатуры функций-членов более длинными, если дополнительные параметры имеют значения по умолчанию.

Тем не менее, нет раздела для шаблонов, поэтому, если они чувствовали необходимость предоставить 17.4.4.3 / 3, мне кажется, что дополнительные параметры шаблона допустимы, за исключением формулировки об обратном.

1
ответ дан 28 November 2019 в 21:46
поделиться

Я тоже видел это заявление. Но.

Во-первых, я никогда не видел, чтобы реализация делала это. Я, кажется, помню, что Андрей Александреску однажды задумал использовать такие вещи, как типы распределителей на стероидах (что-то вроде my_fancy_thing , в то время как просто std :: allocator все равно будет работать , тоже). Но даже это продолжит работу вашего f () , и это самая близкая к реализации, нарушающая ваш пример, о которой я когда-либо слышал.

Я думаю, что это в значительной степени относится к той же категории, что и утверждение о том, что указатель 0 не обязательно должен быть представлен значением со всеми битами, установленными в ноль - даже если у поставщиков действительно есть такая свобода (чего я не знаю, поскольку есть претензии и с обеих сторон), они никогда не будут его использовать, потому что это нарушит практически весь существующий код.

Так что я давно решил не беспокоиться об этом.

0
ответ дан 28 November 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: