template <typename T>
struct A
{
static constexpr T obj {};
static constexpr bool noexcept_copy = noexcept( T{obj} );
static void UsesCopy() { T{obj}; }
static constexpr int C = 1;
};
struct NoCopy
{
constexpr NoCopy() = default;
NoCopy(const NoCopy&) = delete;
};
int main()
{
return A<NoCopy>::C;
}
Приведенный выше код успешно скомпилирован GCC, но Clang выдает ошибку компиляции:
tmp.cpp:6:57: error: call to deleted constructor of 'NoCopy'
static constexpr bool noexcept_copy = noexcept( T{obj} );
^~~~~~
tmp.cpp:20:16: note: in instantiation of template class 'A<NoCopy>' requested here
return A<NoCopy>::C;
^
tmp.cpp:15:9: note: 'NoCopy' has been explicitly marked deleted here
NoCopy(const NoCopy&) = delete;
^
1 error generated.
Функция A::UsesCopy
также использует конструктор копирования, но компилятор не жалуется на использование удаленной функции там. В чем разница между функцией UsesCopy
и noexcept_copy
constexpr? Оба используют конструктор копирования класса NoCopy
, и оба не используются, но определение constexpr вызывает ошибку компиляции, определение функции - нет.
PS. Clang компилирует приведенный выше код с -std=c++17
или -std=c++2a
, но не с -std=c++11
или -std=c++14
.