当隐式转换发生时,对象是否会丢失其常量?

时间:2011-10-30 03:45:58

标签: c++ object const implicit-conversion

我做了一个小实验,但我不理解输出!

class C {
public:
  operator int() const { std::cout << "I'm const" << std::endl;}
  operator int(){ std::cout << "I'm not const" << std::endl;}
};

void f(int){};

int main()
{
  f(C());
}

为什么输出"i'm not const"?不应该是C对象的第一个转换,它是一个rvalue,因此是const,是否是优先的?

谢谢! :)

编辑:如果它可以使问题更精确:

相反:

void g(C const &){ std::cout << "I take a const" << std::endl; };
void g(C &){ std::cout << "I take a non const" << std::endl; };
  

g(C())输出“我带一个const”。

2 个答案:

答案 0 :(得分:4)

暂时不是常数:

C();  // not const

如果你想经常参考它,请把它投下来:

f(static_cast<const C&>(C()));

关键是调用其成员函数(此处为转换运算符)的对象不是常量。这与转换的结果无关。

结果实际上也不需要保持不变。假设我们添加了另一个类:

class D { };

class C {
  // ...
  operator D() { return D(); }
};

int main()
{
  D d;
  static_cast<D>(C()) = d;      // OK: assign d to the result of the conversion
  // static_cast<int>(C()) = 6; // Error: left-hand side is not an lvalue
}

答案 1 :(得分:1)

这可能让你感到惊讶,但这完全合法的C ++:

class C { } ;
int main()
  {
  C d ;
  C() = d ;
  }

请参阅this ideone link以获取证据。所以C()是左值。