编译器对带有元组参数的函数的混淆

compiler confusion on functions with tuple arguments

本文关键字:函数 参数 元组 编译器      更新时间:2023-10-16

我正在使用Apple的LLVM 4.2编译器来编译此C++代码。 我已经重载了一个具有不同元组组合的成员函数,我相信我正确地调用了其中一个,但编译器发现了歧义。 本质上,我试图调用下面的方法 (1),但编译器发现方法 (2) 也是可接受/兼容的。 为什么? 我打开了 C++11 标志。

enum class Enum1 { ... }
enum class Enum2 { ... }
enum class Enum3 { ... }
enum class Enum4 { ... }
void myMethod() {
  Enum1 e1;
  Enum2 e2;
  Enum3 e3;
  doSomething({e1,e2,e3}); // should pick (1), yet compiler finds (2) compatible also!?
}
inline void doSomething(const tuple<Enum1,Enum2,Enum3>& p) { // (1)
  ...
}
inline void doSomething(const tuple<Enum1,Enum2,Enum3,Enum4>& p) { // (2)
  ...
}

你确定编译器认为两者都可以接受,而不是说没有一个是可接受的并列出候选者吗? std::tuple的每元素参数构造函数是explicit的,因此在从大括号初始值设定项复制初始化参数时不符合条件。换句话说,不应选择这两个函数。

您需要在参数中显式构造元组。