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

我使用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的argument-per-element构造函数是显式的,因此在从支撑的初始化程序复制初始化参数时不合格.换句话说,两种功能都不应该被选中.

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

点赞