【发布时间】:2019-01-21 23:59:32
【问题描述】:
以下代码可以使用 GCC 8.2 编译,但不能使用 Clang 6.0.1:
// A struct named Foo.
struct Foo
{
// Data member of type 'int'.
int val;
// Default constructor (constexpr).
constexpr Foo() noexcept : val(0) {}
};
// A struct named Bar.
struct Bar : Foo
{
// Make use of the constructors declared in Foo.
using Foo::Foo;
// A constructor taking an object of type Foo.
// COMMENTING THIS CONSTRUCTOR SOLVE THE COMPILATION ISSUE.
constexpr Bar(Foo const obj) noexcept : Foo(obj) {}
};
// A struct named Test.
struct Test
{
// Data member of type 'Bar'.
Bar bar;
// A defaulted default constructor.
constexpr Test() noexcept = default;
};
// Main function.
int main() { return 0; }
Clang 失败并显示以下消息:
错误:默认构造函数的默认定义不是 constexpr
constexpr Test() noexcept = default;
我想了解 Clang 拒绝此代码的原因。
【问题讨论】:
-
您忘记为
Bar提供默认构造函数(但是,您在Test中使用了该构造函数)。为BarintTest()提供一个参数,或者为Bar提供一个默认构造函数都应该可以解决问题。但是为什么这与 G++ 编译我不明白。 (顺便说一句,gcc 7.3.0 及以下不支持) -
@muXXmit2X 可能 C++17 确实消除了不继承默认构造函数的限制(参见 divinias 的回答,“找不到”)?
-
这很有趣,因为 simplified version of this works 你必须回到 clang 3.8.1 for this to not work ...但是将 constexpr 添加到 mix 中会破坏 simplified version
标签: c++ language-lawyer constexpr clang++ default-constructor