#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;
}
error: '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}}}' is not a constant expression
Я получаю, что переменная стека и статическая переменная находятся в разных местах в памяти, но компилятор ПРИНИМАЕТ произвольные объекты в качестве локальных переменных как constexpr. Мой класс Foo не имеет аргумента const char*, так что это разница, но это не значит, что конструктор const char* нельзя использовать в constexpr, потому что выше:
Мне интересно, почему std::string не может быть constexpr, если это переменная стека: [code]#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; }
error: '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}}}' is not a constant expression [/code] Я получаю, что переменная стека и статическая переменная находятся в разных местах в памяти, но компилятор ПРИНИМАЕТ произвольные объекты в качестве локальных переменных как constexpr. Мой класс Foo не имеет аргумента const char*, так что это разница, но это не значит, что конструктор const char* нельзя использовать в constexpr, потому что выше: [code]constexpr std::string str15 {"123456789012345"}; // THIS COMPILES [/code] https://godbolt.org/z/cffPq6nns