https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111258
Bug ID: 111258 Summary: std::string cannot to be moved in constant evaluated expression Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: kisses07_rupee at icloud dot com Target Milestone: --- c++20 std::string's destructor fails after move: #include <string> using namespace std::literals; constexpr auto foo(auto a) { auto b = std::move(a); return b[1]; } int main(int,char**) { static_assert( foo("hello"s) == 'e' ); return 0; } fails with: <source>: In function 'int main(int, char**)': <source>:11:34: error: non-constant condition for static assertion 11 | static_assert( foo("hello"s) == 'e' ); | ~~~~~~~~~~~~~~^~~~~~ <source>:11:23: in 'constexpr' expansion of 'foo<std::__cxx11::basic_string<char> >(std::literals::string_literals::operator""s(const char*, std::size_t)(5))' <source>:11:42: in 'constexpr' expansion of 'std::__cxx11::basic_string<char>((* & std::move<__cxx11::basic_string<char>&>(a)))' <source>:11:34: error: accessing 'std::__cxx11::basic_string<char>::<unnamed union>::_M_allocated_capacity' member instead of initialized 'std::__cxx11::basic_string<char>::<unnamed union>::_M_local_buf' member in constant expression Compiler returned: 1 online demo: https://godbolt.org/z/Tz7MK58f1 it seems it's affecting on bug 103924