Следует ли создавать определение внутри класса шаблона, если оно не используется? - программирование
Подтвердить что ты не робот

Следует ли создавать определение внутри класса шаблона, если оно не используется?

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.

4b9b3361