构造临时对象时出错,其构造函数采用单个枚举参数

时间:2014-11-27 18:27:12

标签: c++ constructor enums temporary-objects

为什么以下代码无效(至少使用Visual Studio 2010或ideone)?

// E.h
enum E
{
  AN_E_VALUE
};

// C.h
class C
{
public:
  explicit C(E e) // explicit keyword is optional
  {}

  void Foo() {}
};

// main.cpp
int main(int argc, char** argv)
{
  C c(AN_E_VALUE);      // fine
  C(AN_E_VALUE);        // error
  C(AN_E_VALUE).Foo();  // fine
  return 0;
}

如果参数不是单个枚举类型,则可以正常工作。

编译器将错误调用理解为具有0个参数的调用,其中1是预期的。这是为什么?

1 个答案:

答案 0 :(得分:3)

C(AN_E_VALUE);

这声明了一个名为C的{​​{1}}类型的对象。该错误引发了一个事实,即您需要一个默认构造函数来初始化AN_E_VALUE,但不存在默认构造函数(并且没有隐式声明)。
你有没有试过这个?:

AN_E_VALUE

这基本上完成了同样的事情。也许请查看this question