【发布时间】:2013-05-22 18:13:36
【问题描述】:
Clang documentation 巧妙地解释了这一点
如果类或结构没有用户定义的默认构造函数,C++ 不允许您默认构造它的 const 实例,例如 这([dcl.init],p9)
下面的代码有这样一个用户定义的Base的默认构造函数,但是g++和Clang不同意Derived的默认构造函数是否是用户定义的,即使Derived确实显式继承了所有@987654326 @构造函数(使用new C++11 inheriting constructors feature)
#include <iostream>
class Base
{
public:
Base(): b_(0) {} // look! user-defined default constructor
void print() const { std::cout << b_ << "\n"; }
private:
int b_;
};
class Derived
:
public Base
{
using Base::Base; // does this constitute a user-defined default constructor?
};
int main()
{
Base const b;
b.print(); // 0 for g++ & CLang
Derived const d;
d.print(); // 0 for g++, Clang: "default initialization of an object of const type 'const Derived' requires a user-provided default constructor"
}
g++ 4.8 很乐意接受此代码,但 Clang 3.3 不接受。标准是怎么说的?
注意:没有Base 的用户定义默认构造函数,g++ 4.8 和 Clang 3.3 都不接受 Base const b;(而例如 g++ 4.7.2 之前接受了)。鉴于 g++ 知道该规则,我认为这意味着 g++ 将 Derived 的默认构造函数视为用户定义的。但 Clang 3.3 不这么认为。
更新:基于@JesseGood 的回答,即0/1 参数构造函数永远不会被继承,我尝试将Base 构造函数更改为
Base(int b = 0, void* = nullptr): b_(b) {}
但它不能解决 Clang 错误。
【问题讨论】:
-
你说得对,我误读了这个问题。
标签: c++ c++11 g++ clang default-constructor