在我的 Qt5 项目中,我遇到了以下设置:
#include <initializer_list>
struct QJsonArray;
struct QJsonValue
{
/*explicit*/ QJsonValue(QJsonArray const &) {}
};
struct QJsonArray
{
QJsonArray(QJsonArray const &) {}
QJsonArray(std::initializer_list<QJsonValue>) {}
};
void f(QJsonArray a = {})
{
QJsonArray b {a}; // GCC: init-list ; Clang: Copy-Cc
QJsonArray c (a); // GCC: Copy-Cc ; Clang: Copy-Cc
}
int main()
{
f();
}
您可以在注释行中看到 GCC 和 Clang 对于应该调用什么构造函数存在分歧。
(您可以在C++ 编译器资源管理器 https://godbolt.org/带有最新的 GCC 和带有标志的 Clang-std=c++11
)
如果我取消注释explicit
,两个编译器都选择相同的构造函数(复制构造函数)。
这里是哪个编译器?
GCC 在这里是正确的。对于非聚合,使用花括号初始化列表可以绕过复制构造函数,更喜欢匹配initializer_list
构造函数。自从QJsonArray
可以隐式转换为QJsonValue
, and QJsonArray
has an initializer_list
构造函数需要QJsonValue
s,该构造函数将被优先使用,甚至优于复制构造函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)