У меня есть static_assert
в конструкторе перемещения структуры шаблона. Является ли этот static_assert
обязательным для рассмотрения компилятором, даже если возможно копирование?
Это урезанный сценарий:
#include <type_traits>
template<typename T>
struct X
{
X(X&&) { static_assert(std::is_same<void, T>::value, "Intentional Failure"); }
};
auto impl() -> X<int>;
auto test() -> decltype(impl())
{
return impl();
}
int main()
{
test();
}
GCC и Clang соглашаются оценить static_assert
и не скомпилировать.
MSCV и ICC, с другой стороны, компилируют код очень хорошо.
Интересно, когда я удаляю определение конструктора move
и просто объявляю его следующим образом:
template<typename T>
struct X
{
X(X&&);
};
GCC и Clang также компилируют код сейчас. Таким образом, все компиляторы, похоже, согласны с тем, что определение конструктора перемещения не имеет отношения к копированию.
Вопрос:
Если в конструкторе copy/move существует static_assert
, требует ли стандарт, чтобы он оценивался, даже если возможно копирование/перемещение?