Всегда ли происходит построение NTTP для CTAD, даже если задано значение типа этой специализации? [дубликат]C++

Программы на C++. Форум разработчиков
Anonymous
 Всегда ли происходит построение NTTP для CTAD, даже если задано значение типа этой специализации? [дубликат]

Сообщение Anonymous »

Это (частично) уменьшено по сравнению с тем, что CTAD создает экземпляр другой специализации при указании явного аргумента.
https://godbolt.org/z/5To7nKEP3

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

template
struct Bar {
int n = N;
constexpr Bar() {}
constexpr Bar(const Bar& b): n{b.n - 1} {}
};

template constexpr int get_n() { return b.n; }

constexpr auto b = Bar{};
static_assert(b.n == 1);

#ifdef _MSC_VER
static_assert(get_n() == 1);
#else
static_assert(get_n() == 0);
#endif
Clang и GCC, кажется, всегда вызывают и выводят из конструктора(ов) Bar, чтобы определить реальный аргумент шаблона, даже если данный аргумент относится к типу специализации Bar, с чем MSVC не согласен.
Что говорит стандарт?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -that-spec

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