【发布时间】:2019-05-06 22:27:57
【问题描述】:
看看这段代码:
struct NonConstexpr {
NonConstexpr() { }
};
template <typename T>
struct Bar {
NonConstexpr nonConstexpr;
constexpr Bar() { }
};
struct Foo {
Bar<void> bar;
constexpr Foo() { }
};
Foo 有一个成员 Foo::bar::nonConstexpr,它有一个非 constexpr 构造函数。所以,我的期望是这不应该编译。但它使用 gcc、clang 和 msvc 编译。这是编译器错误,还是某些规则允许此代码编译?
如果我将NonConstexpr 成员直接添加到Foo 中,代码将不再编译。
(我遇到了这个问题,因为我希望对全局 Foo 对象进行静态初始化,但它被动态初始化了,并且由于“静态初始化顺序惨败”而导致了问题)
【问题讨论】:
-
如果
Bar不是模板,GCC 不会编译此代码。可能,一个相关的问题:stackoverflow.com/questions/46119548/…
标签: c++ language-lawyer c++17