这段代码片段
struct Base{};
struct Derived: Base{
using Base::Base;
};
int main()
{
Base b;
Derived d{b};
}
在 clang++3.9 上编译良好 https://godbolt.org/g/buX56c,然而它在所有 gcc 上都失败 http://coliru.stacked-crooked.com/a/d1743be2631af6db(包括 7 个)以及版本小于 3.9 且带有错误消息的 clang
错误:没有匹配的函数可用于调用“Derived::Derived() Derived d{b}”。
上面的代码是否符合标准?
PS:如果我注释掉using Base::Base
行,代码在 clang-3.9 上不再编译。
This is CWG 2356 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2356. It appears that both gcc and clang implement this already (clang 4.0+ rejects it), despite it still being "tentatively ready" and not actually adopted into the working draft yet. even thought it was only just adopted into the working draft in Rapperswil last month via P1114 http://wiki.edg.com/pub/Wg21rapperswil2018/StrawPolls/p1114r0.html.
那里的规则是:
从类类型继承的构造函数C
(15.6.3 [class.inhctor.init]),其第一个参数的类型为“引用”cv1 P
”(包括从模板实例化的构造函数)在构造 类型的对象时被排除在候选函数集中cv2 D
如果参数列表只有一个参数并且C
与参考相关P
and P
与参考相关D
.
这不包括Base
考虑复制构造函数(在我们的例子中C
and P
都是B
, and B
与参考相关D
),这就是两个编译器拒绝您的代码的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)