gpt4 book ai didi

c++ - 继承的默认构造函数也是用户定义的吗?

转载 作者:IT老高 更新时间:2023-10-28 23:20:15 24 4
gpt4 key购买 nike

Clang documentation巧妙地解释了

If a class or struct has no user-defined default constructor, C++ doesn't allow you to default construct a const instance of it like this ([dcl.init], p9)

下面的代码对Base有这样一个用户自定义的默认构造函数,但是g++和Clang不同意Derived的默认构造函数是否是用户自定义的,即使Derived 确实显式继承了所有 Base 构造函数(使用 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 错误。

最佳答案

Clang 是正确的。

关于 const 实例的相关文章来自 8.5p7:

If a program calls for the default initialization of an object of a const-qualified type T, T shall be a class type with a user-provided default constructor.

由于 Base(): b_(0) {} 是用户提供的,所以 Base const b; 就可以了。

下一个重要的部分是 12.9p3:

For each non-template constructor in the candidate set of inherited constructors other than a constructor having no parameters or a copy/move constructor having a single parameter, a constructor is implicitly declared with the same constructor characteristics unless there is a user-declared constructor with the same signature in the class where the using-declaration appears

这里的重要部分是粗体文本。我相信这排除了你的情况,因为 Base() 是一个没有参数的构造函数。这意味着 Derived 没有用户提供的默认构造函数(尽管仍然隐式声明了一个)。

这也意味着来自基类的默认、复制和移动构造函数从不继承。

关于c++ - 继承的默认构造函数也是用户定义的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16780786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com