【发布时间】:2016-11-29 19:51:36
【问题描述】:
假设我们有两个字面量类型 A 和 B 定义如下。文字类型 B 可以在编译时从文字类型 A 初始化。第三个非文字类型C包含文字类型B作为成员。问题是,如果我们在编译时初始化 a 并将其传递给 C 的构造函数,那么 b 是否也在编译时初始化?由于 C 是非文字类型,其成员 v 在编译时不会被初始化。但是,b 是否发生了部分编译时初始化?如果是这种情况,如果在 C 中使用 constexpr 成员函数,例如 f,是否会在编译时进行评估?显然我们不能在编译时在结构 C 之外使用这样的函数,因为我们不能将 C 的对象声明为 constexpr。
struct A {
constexpr A(int num): num{num} {}
int num;
};
struct B {
constexpr B(A a): num{a.num} {}
int num;
};
template<typename T>
struct C {
C(A a, std::initializer_list<T> data): b{a}, v{data} {}
constexpr int f() const {
return b.num + 42;
}
B b;
std::vector<T> v;
};
int main() {
constexpr A a {4};
C<int> c {a, {5}};
}
【问题讨论】:
-
标准没有定义“编译时间”。你只能问某事是否是一个常量表达式。