я наткнулся на некоторые C++ 11 код, который выглядит следующим образом:constexpr статический член против переменной
// some_file.h
namespace blah {
class X {
public:
constexpr const static std::initializer_list<uint64> SOME_LIST =
{1,2,3};
};
}
// some_file.cpp
#include "some_file.h"
namespace blah {
constexpr const std::initializer_list<uint64> X::SOME_LIST;
}
Что компилируется нормально. Я предполагаю, что определение в файле cpp используется, чтобы избежать дублирования символов в каждом файле, который включает заголовок (пожалуйста, исправьте меня, если я ошибаюсь).
Затем я попробовал следующее:
// my_file.h
namespace bleh {
constexpr const static char SOME_CONSTANT[] = "yay";
}
// my_file.cpp
#include "my_file.h"
namespace bleh {
// if I add this or any other variation, compilation breaks!
//constexpr const static char SOME_CONSTANT[];
}
Код выше не работает, если я добавить явное определение в файле .cpp. Поэтому мне интересно: есть ли дублирование символов во втором случае? Если да, существует ли способ определить переменную без охватывающего класса?
'constexpr const X :: SOME_LIST;' отсутствует спецификатор типа. Вы уверены, что это код, который скомпилирован? – typ1232
@ typ1232 извинения, я написал код без собственно компиляции, но я искал образец, который компилируется. –