具有多重继承的 C++ 构造函数重载解决方案
C++ Constructor Overload Resolution with Multiple Inheritance
我有这个简短的代码片段,我想获得更多关于为什么重载解析选择一个构造函数而不是另一个构造函数的信息。这是有问题的代码:
#include <iostream>
struct Base
{
};
struct Other
{
Other(const Other&)
{
std::cout << "Copy Constructor\n";
}
Other(const Base&)
{
std::cout << "Custom Constructor\n";
}
};
struct Derived : public Base, public Other
{
Derived() :
Other(*this)
{
}
};
int main()
{
Derived derived; // Prints "Copy Constructor"
system("pause");
return 0;
}
我假设 C++ 标准中有一个部分将复制构造函数定义为比用户定义的构造函数更匹配*?否则我的假设是,如果不存在有利于复制构造函数的规则,那么编译器将按照继承顺序(与多重继承的构造顺序一样)或者只是给我一个模糊的构造函数调用错误。然而,颠倒 Derived
从 Base
和 Other
继承的顺序不会改变输出,这让我相信我最初关于复制构造函数受到青睐的猜测是正确的。谁能指出决定我所看到的行为的规则?
* 我检查了 cppreference.com's Overload Resolution page,但我没有看到那里列出的任何规则可以解释我所看到的行为(虽然我
标准语不是很流利,所以我很容易错过它)。
有问题的代码片段编译的原因是 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/ 的错误输出。
我有这个简短的代码片段,我想获得更多关于为什么重载解析选择一个构造函数而不是另一个构造函数的信息。这是有问题的代码:
#include <iostream>
struct Base
{
};
struct Other
{
Other(const Other&)
{
std::cout << "Copy Constructor\n";
}
Other(const Base&)
{
std::cout << "Custom Constructor\n";
}
};
struct Derived : public Base, public Other
{
Derived() :
Other(*this)
{
}
};
int main()
{
Derived derived; // Prints "Copy Constructor"
system("pause");
return 0;
}
我假设 C++ 标准中有一个部分将复制构造函数定义为比用户定义的构造函数更匹配*?否则我的假设是,如果不存在有利于复制构造函数的规则,那么编译器将按照继承顺序(与多重继承的构造顺序一样)或者只是给我一个模糊的构造函数调用错误。然而,颠倒 Derived
从 Base
和 Other
继承的顺序不会改变输出,这让我相信我最初关于复制构造函数受到青睐的猜测是正确的。谁能指出决定我所看到的行为的规则?
* 我检查了 cppreference.com's Overload Resolution page,但我没有看到那里列出的任何规则可以解释我所看到的行为(虽然我 标准语不是很流利,所以我很容易错过它)。
有问题的代码片段编译的原因是 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/ 的错误输出。