Почему шаблоны классов не позволяют определять константный статический элемент данных вне класса как constexprC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему шаблоны классов не позволяют определять константный статический элемент данных вне класса как constexpr

Сообщение Anonymous »

На примере частичного упорядочения я узнал, что мы можем определить статический элемент данных constexpr вне класса, как показано в:

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

struct A
{
static const double i;
};
constexpr double A::i{};
constexpr double j = A::i; //valid c++ and accepted by all compilers.
Но потом, когда я попытался сделать то же самое с шаблоном класса, я заметил, что один компилятор компилирует программу, а другой отклоняет ее. Например, gcc компилирует #1, но и clang, и msvc отклоняют #1. Демо-1.
И если я изменю double на int, то clang и gcc примут программу(), но msvc по-прежнему отклоняет #2. Демо-2

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

template
class C
{
public:
static const double mem;
static const int    k;
};

template
constexpr double C::mem{};

template
constexpr int C::k{};
int main()
{
constexpr double i  = C::mem; //#1: gcc accepts but both clang and msvc rejcects
constexpr int    j  = C::k;   //#2: gcc and clang accepts but msvc rejects
}
Я хочу знать, какой компилятор находится здесь в соответствии со стандартом C++ для двух случаев 1 и 2.
Для справки, вот ошибка clang для #1:

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

:14:22: error: constexpr variable 'i' must be initialized by a constant expression
14 |     constexpr double i  = C::mem; //#1: gcc accepts but both clang and msvc rejcects
|                      ^    ~~~~~~~~~~~~~~
:14:27: note: read of non-constexpr variable 'mem' is not allowed in a constant expression
14 |     constexpr double i  = C::mem; //#1: gcc accepts but both clang and msvc rejcects
|                           ^
:5:30: note: declared here
5 |          static const double mem;
|                              ^
Обратите внимание, что я не ищу обходной путь, поскольку знаю, что могу просто определить члены внутри строки, заменив const int< /code> с constexpr int.

Подробнее здесь: https://stackoverflow.com/questions/782 ... -outside-t
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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