C++具有多重继承的构造函数重载解析



我有一小段代码,我想获得更多关于为什么重载分辨率选择一个构造函数而不是另一个构造函数的信息。这是有问题的代码:

#include <iostream>
struct Base
{
};
struct Other
{
Other(const Other&)
{
std::cout << "Copy Constructorn";
}
Other(const Base&)
{
std::cout << "Custom Constructorn";
}
};
struct Derived : public Base, public Other
{
Derived() :
Other(*this)
{
}
};
int main()
{
Derived derived;    // Prints "Copy Constructor"
system("pause");
return 0;
}

我假设C++标准中有一个部分将复制构造函数定义为比用户定义的构造函数更好的匹配*?否则我的假设是,如果不存在有利于复制构造函数的规则,那么编译器要么按继承顺序(就像多重继承的构造顺序一样(,要么只是给我一个模棱两可的构造函数调用错误。但是,反转DerivedBaseOther继承的顺序不会改变输出,这让我相信我最初关于复制构造函数受到青睐的猜测是正确的。谁能指出我决定我所看到的行为的规则?

* 我检查了 cppreference.com 的重载分辨率页面,但我没有看到那里列出的任何规则可以解释我所看到的行为(尽管我 标准语不完全流利,所以我很容易错过它(。

有问题的代码片段编译的原因是由于Visual Studio的非标准一致性行为(我目前正在使用VS2017.3预览版,即使使用/permissive-标志,它也可以编译代码而不会出错(。以下是GCC和Clang发出的错误:

海湾合作委员会

Error(s):
source_file.cpp: In constructor ‘Derived::Derived()’:
source_file.cpp:25:20: error: call of overloaded ‘Other(Derived&)’ is ambiguous
Other(*this)
^
source_file.cpp:16:5: note: candidate: Other::Other(const Base&)
Other(const Base&)
^
source_file.cpp:12:5: note: candidate: Other::Other(const Other&)
Other(const Other&)
^

Error(s):
source_file.cpp:25:9: error: call to constructor of 'Other' is ambiguous
Other(*this)
^     ~~~~~
source_file.cpp:12:5: note: candidate constructor
Other(const Other&)
^
source_file.cpp:16:5: note: candidate constructor
Other(const Base&)
^
1 error generated.

错误输出取自 http://rextester.com/。

相关内容

  • 没有找到相关文章

最新更新