[英]Why is constexpr required even though member function is constexpr?
The following does not compile unless I put constexpr before initializer_list: 除非我在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;
But initializer_list size is constexpr: 但是initializer_list的大小是constexpr:
constexpr size_type size() const;
std::initializer_list<int> il = rand() ? std::initializer_list<int>{1}
: std::initializer_list<int>{1,2,3};
std::array<int, il.size()> a;
That's why. 这就是为什么。
A constexpr
member function is a function that can be executed within a constant expression, it doesn't necessarily yield a result that is a compile-time constant. constexpr
成员函数是一个可以在常量表达式中执行的函数,它不一定产生一个编译时常量的结果。 For example: 例如:
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
By writing std::array<int, il.size()> a;
通过编写
std::array<int, il.size()> a;
you are claiming that il.size()
can be evaluated at compile time with a constant result, allowing template instantiation. 你声称可以在编译时使用常量结果评估
il.size()
,允许模板实例化。
That's why both the initializer_list::size()
method and your il
variable need to be declared as constexpr
. 这就是为什么
initializer_list::size()
方法和你的il
变量都需要声明为constexpr
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.