Почему std::string может создать объект constexpr, только если это статическая переменная?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему std::string может создать объект constexpr, только если это статическая переменная?

Сообщение Anonymous »

Мне интересно, почему std::string не может быть constexpr, если это переменная стека:

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

#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://godbolt.org/z/cffPq6nns

Подробнее здесь: https://stackoverflow.com/questions/798 ... c-variable
Ответить

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

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

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

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

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