Определение членов статических данных constexpr

Итак, я знаю, что в C ++ статические члены могут быть инициализированы внутри класса, если они являются константным литеральным типом, подобным следующему

class test{
public:
        static constexpr int stc = 1;
private:
        int a = 0;
        int b = 0;
        int c = 0;
};

и статическая переменная constexpr stc могут использоваться, когда компилятор может напрямую подставить значение члена i.e

int main () {int array[test::stc];}  

Однако, если используется в контексте, где значение не может быть напрямую подставлено компилятором:

int main() { const int &cs = test::stc; } 

тогда компилятор (clang) генерирует ошибку

c++ -std=c++11 -pedantic    t.cpp   -o t
Undefined symbols for architecture x86_64:
  "test::stc", referenced from:
      _main in t-a8ee2a.o
ld: symbol(s) not found for architecture x86_64

если статический член не определен вне класса, например, так:

constexpr int test::stc;

Почему это так?

4 голоса | спросил The Enigma 1 Mayam18 2018, 01:26:56

1 ответ


0
В---- +: = 1 =: + ---- используется odr в то время как вэто не так.Следующий пример из стандарта C ++ 11 поддерживает вышеуказанную идею.Если рассматривать это с практической точки зрения, ---- +: = 4 =: + ---- будет недействительной ссылкой, если ---- +: = 5 =: + ---- не имеет адреса.---- +: = 6 =: + ---- , с другой стороны, нужно только значение ---- +: = 7 =: + ---- , которое можно оценить во время компиляции.---- +: = 8 =: + ---- не требуется адрес ---- +: = 9 =: + ----, чтобы быть действительным объектом.Объект, который используется odr, должен быть определен в программе ровно один раз.
ответил R Sahu 1 Mayam18 2018, 08:43:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132