我做了一个小实验,但我不理解输出!
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”。
答案 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()
是左值。