下面的代码是用C++14/17/20编译的,使用了GCC和Clang,即使这两个构造函数在main
中的给定示例化中具有相同的签名:
#include <iostream>
#include <tuple>
template <typename... OpsT>
struct compose_op {
const std::tuple<OpsT...> ops;
template <typename TupleT = std::tuple<OpsT...>>
constexpr compose_op()
{
std::cout << "constructor 0" << std::endl;
}
constexpr explicit compose_op(OpsT... ops) : ops{ops...} {
std::cout << "constructor 1" << std::endl;
}
};
int main() {
compose_op<> op{};
}
使用了第二个构造函数,但如果将其注解掉,则使用第一个构造函数。
我想了解的是:
- 为什么这不被认为是有歧义的,但是如果我使两个构造函数都模板化或者都不模板化,那么它就变得有歧义了?
- 在这种情况下,当两个构造函数都匹配时,C++如何在两个构造函数之间进行选择?
1条答案
按热度按时间jdg4fx2g1#
从cppreference开始:
最佳可行函数
[... 1到3不适用,它们是关于隐式转换的... ]
1.或者,如果不是这样,则F1是非模板函数,而F2是模板专用化
简而言之:非模板构造函数胜过模板构造函数。