我使用 MSVC v141 和/std:c++17.
constexpr const char* test(const char* foo) {
return foo + 1;
}
constexpr const char* bc = test("abc");
Run Code Online (Sandbox Code Playgroud)
编译得很好,而
constexpr const char* test(const char* foo) {
constexpr auto bar = foo;
return bar + 1;
}
constexpr const char* bc = test("abc");
Run Code Online (Sandbox Code Playgroud)
失败:
错误 C2131:表达式未计算为常量
失败是由在其生命周期之外读取变量引起的
注意:参见'foo'的用法
这是正确的行为还是 MSVC 中的错误?
对我来说似乎是预期的行为。一个用 with 声明的函数constexpr意味着它可以在编译时被评估,但不是必须的。所以你的函数在运行时评估时也应该是有效的。这是问题线
constexpr auto bar = foo;
Run Code Online (Sandbox Code Playgroud)
因为它试图constexpr从一个非对象创建一个对象constexpr。