c++ 具有相同签名的两个构造函数的定义在其中一个被模板化时不冲突

k5ifujac  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(112)

下面的代码是用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++如何在两个构造函数之间进行选择?
jdg4fx2g

jdg4fx2g1#

cppreference开始:
最佳可行函数
[... 1到3不适用,它们是关于隐式转换的... ]
1.或者,如果不是这样,则F1是非模板函数,而F2是模板专用化
简而言之:非模板构造函数胜过模板构造函数。

相关问题