【发布时间】:2021-02-08 04:30:00
【问题描述】:
除非您将标记为 ok 的行替换为标记为 fails 的行,否则以下代码将按预期编译和工作。唯一的区别是我正在制作一个本地临时 constexpr 变量。我不明白为什么它只在一种情况下失败。
#include <array>
using TArray = std::array<int, 2>;
using TSize = TArray::size_type;
constexpr TSize Fn(const TArray& myArray)
{
//constexpr TSize ret{myArray.size()}; return ret; // fails
return myArray.size(); // ok
}
int main()
{
constexpr TArray ar{};
constexpr TSize i{Fn(ar)};
return i;
}
gcc 和 c++17 的错误是
<source>: In function 'constexpr TSize Fn(const TArray&)':
<source>:15:39: error: 'myArray' is not a constant expression
15 | constexpr TSize ret{myArray.size()}; return ret; // fails
我想补充一点,我意识到错误状态 myArray 不是一个常量表达式。我不能使它成为一个常量表达式,因为它是一个引用参数。
我的问题是不是如何修复代码或使其正常工作。这就是为什么编译器接受 ok like 但不接受 fail 行?
【问题讨论】:
-
我认为你应该用 [language-lawyer] 标记它并删除 [gcc]。
-
a
constexpr函数必须是合法函数,这意味着它不能在常量表达式中调用,在这种情况下它的参数可能不是常量表达式。