Код: Выделить всё
#include
#include
#include
constexpr std::string str15 {"123456789012345"}; // This compiles!
struct Foo
{
constexpr Foo() : a(6) {
for (int i = 0; i < 8; ++i)
buff[i] = 0;
}
int a;
char buff[8];
};
constexpr void func()
{
constexpr Foo f{}; // This compiles
constexpr std::string str15 {"123456789012345"}; // This doesn't compile
}
int main() {
func();
return 0;
}
'std::string{std::__cxx11::basic_string::_Alloc_hider{((char*)(& str15.std::__cxx11::basic_string::.std::__cxx11::basic_string::::_M_local_buf))}, 15, std::__cxx11::basic_string::{char [16]{'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', 0}}}' не является постоянным выражением.
Я получаю, что переменная стека и статическая переменная находятся в разных местах в памяти, но компилятор будет принимать произвольные объекты в качестве локальных переменных как constexpr. Мой класс Foo не имеет аргумента const char*, так что это разница, но это не значит, что конструктор const char* нельзя использовать в constexpr, потому что выше:
Код: Выделить всё
constexpr std::string str15 {"123456789012345"}; // This compiles
Подробнее здесь: https://stackoverflow.com/questions/798 ... c-variable
Мобильная версия