Std::условная оценка ветвления во время компиляцииC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Std::условная оценка ветвления во время компиляции

Сообщение Anonymous »

Составляем это:

Код: Выделить всё

template < class T, class Y, class ...Args >
struct isSame
{
static constexpr bool value = std::conditional<
sizeof...( Args ),
typename std::conditional<
std::is_same< T, Y >::value,
isSame< Y, Args... >, // Error!
std::false_type >::type,
std::is_same< T, Y > >::type::value;
};

int main()
{
qDebug() ::value;
return EXIT_SUCCESS;
}
Выдает следующую ошибку компилятора:

Код: Выделить всё

error: wrong number of template arguments (1, should be 2 or more)
Проблема в том, что isSame< double, int > имеет пустой пакет параметров Args, поэтому isSame< Y, Args... > фактически становится isSame< Y >/code>, который не соответствует сигнатуре.

Но мой вопрос: почему эта ветвь вообще оценивается? sizeof...( Args ) имеет значение false, поэтому внутренний std:conditional не должен оцениваться. Это не фрагмент кода во время выполнения, компилятор знает, что sizeof..( Args ) никогда не будет истинным с заданными типами шаблонов.

Если вам интересно, это должна быть вариативная версия std::is_same, а не то, чтобы она работала...

Подробнее здесь: https://stackoverflow.com/questions/240 ... evaluation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»