【发布时间】:2013-02-01 11:46:08
【问题描述】:
考虑以下二叉树,其中节点有两个儿子或带有标签的叶子。此代码在 g++ 4.7.2 中编译:
#include <memory>
using namespace std;
struct Tree {
unique_ptr<Tree> left, right;
char label;
Tree(char label) : label(label) {}
Tree(Tree && left, Tree && right) :
left(new Tree(move(left))),
right(new Tree(move(right))) {}
//~ explicit Tree(Tree && left, bool right) {}
} tree {{1, 2}, 3};
当我取消注释显式构造函数时,它无法编译(如果这个显式构造函数是私有的,它也会失败)。这是 gcc 错误,还是显式构造函数禁止对具有相同数量参数的非显式构造函数使用初始化列表构造?
编辑:s/隐式/非显式/。抱歉,我使用“隐式”一词表示“允许隐式转换”,而“显式”表示“用关键字显式标记”。我将编译器自动生成的构造函数称为“默认”,所以我没有注意到“隐式”这个词会如此含糊。
【问题讨论】:
-
哪个“显式构造函数”?我看到两个。而且AFAIR,在您定义构造函数的那一刻,编译器没有定义默认构造函数。
-
无论使用{}还是()初始化语法都应该编译失败。