У меня есть макросы, которые работают с типами и начальными значениями. Мне нужно, чтобы бросить начальное значение vIni
к vType
(vIni
всегда конвертируются в vType
, иногда он имеет тот же тип). vIni
также может быть пустым, и в этом случае vType
должен быть неинициализирован или инициализирован по умолчанию. Результат передается в шаблонную функцию.Какие временные элементы не могут быть инициализированы с помощью `someType()` в C++ 11?
Короче говоря,
template<typename T> void foo(const T& o);
foo(vType(vIni));
foo(vType());
должны компилировать.
Я уже обнаружил, что foo(unsigned int())
или foo(int*())
не компилируется, но его можно обойти с помощью typedef.
Что такое другие случаи (помимо встроенных типов с пробелами и указателями), которые потерпят неудачу?
Очевидно, что 'недействительными()', но есть больше, чтобы сделать с тем, что вы не можете иметь 'void' объектов, чем точный синтаксис. – MSalters
Возможный дубликат http://stackoverflow.com/questions/4669131/how-to-check-if-a-template-argument-is-default-constructible, также см. Http: //en.cppreference.com/w/cpp/types/is_default_constructible –
@ChristopherCreutzig: это не тот вопрос, о котором я могу сказать. Речь идет не только о самом типе, но и о том, как назван тип (следовательно, «можно работать с typedef»). Разумеется, ответ на этот предполагаемый обман не отвечает на этот вопрос. –