为什么即使成员函数是constexpr,仍需要使用constexpr?

14
以下代码不会编译通过,除非在initializer_list前加上constexpr关键字:
constexpr std::initializer_list<int> il = {
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};
std::array<int, il.size()> a;

但是initializer_list的大小是constexpr的:

constexpr size_type size() const;

1
甚至不清楚 constexpr std::initializer_list<int> li = {..}; 在 C++11 中是否有效;它将在 C++1y 中生效。 - dyp
2个回答

32
std::initializer_list<int> il = rand() ? std::initializer_list<int>{1}
                                       : std::initializer_list<int>{1,2,3};

std::array<int, il.size()> a;

那就是原因。

constexpr 成员函数是一种函数,在常量表达式中可以执行,但不一定产生编译时常量的结果。例如:

struct S
{
    int m;
    constexpr int foo() const { return m; }
};

S s{rand()};
int j = s.foo();     // only known at run-time

constexpr S cs{42};
int arr[cs.foo()];   // compile-time constant

2
通过编写 std::array<int, il.size()> a;,您声称il.size()可以在编译时计算出常量结果,从而允许模板实例化。
这就是为什么initializer_list::size()方法和您的il变量都需要声明为constexpr的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接