问题 返回constexpr的函数无法编译


为什么不编译:
可能有问题吗? string 作为回归类型?

constexpr std::string fnc()
{
    return std::string("Yaba");
}

4092
2017-10-15 16:15


起源



答案:


的构造函数 std::string 带指针 char 不是 constexpr。在 constexpr 函数只能使用函数 constexpr


14
2017-10-15 16:22



谢谢,之前不知道。 - smallB
+1和构造函数不能的原因 constexpr 它是否具有在编译时无法执行的副作用(即分配)。 - Jon Purdy
@smallB:一个常量表达式构造函数必须是1.声明的 constexpr 2.有一个成员初始化部分只涉及潜在的常量表达式和3.有一个空体。在我看来,这 std::string 必须违反#2。 - Jon Purdy
@smallB:好的。我从来没有说过任何相反的话。 - Jon Purdy
@smallB你不能拥有 constexpr 构造函数 std::string 这需要任意长度 const char* 并且安全。虽然字符串文字是常量表达式,但有很多类型的东西 const char* 这不是常量表达式。该 c_str 成员 std::string 浮现在脑海中。重载 constexpr 无法区分这两者。 - Luc Danton


答案:


的构造函数 std::string 带指针 char 不是 constexpr。在 constexpr 函数只能使用函数 constexpr


14
2017-10-15 16:22



谢谢,之前不知道。 - smallB
+1和构造函数不能的原因 constexpr 它是否具有在编译时无法执行的副作用(即分配)。 - Jon Purdy
@smallB:一个常量表达式构造函数必须是1.声明的 constexpr 2.有一个成员初始化部分只涉及潜在的常量表达式和3.有一个空体。在我看来,这 std::string 必须违反#2。 - Jon Purdy
@smallB:好的。我从来没有说过任何相反的话。 - Jon Purdy
@smallB你不能拥有 constexpr 构造函数 std::string 这需要任意长度 const char* 并且安全。虽然字符串文字是常量表达式,但有很多类型的东西 const char* 这不是常量表达式。该 c_str 成员 std::string 浮现在脑海中。重载 constexpr 无法区分这两者。 - Luc Danton