我不清楚临时是否假定const类型,如下所示的表达式。
#include <iostream>
class X {
public:
X(int a) { i = a; cout << "X(int) [" << (int)this << "]" << endl; }
X& operator+(const X& x)
{
i += x.i;
cout << "X operator+(const X&) [" << (int)this << "]" << endl;
return *this;
}
~X() { cout << "~X [" << (int)this << "]" << endl; }
private:
int i;
};
int main()
{
X x = X(3) + X(4);
cout << "done" << endl;
return 0;
}
X(3)
的行为类似于非const(因为我可以调用operator+
,而X(4)
的行为类似于const(因为,它需要operator+
中的const参数)。
有人可以澄清一下,正确的理解是什么?
答案 0 :(得分:2)
你可以打电话给非const
临时成员。但是你不能将非const
引用绑定到临时。
答案 1 :(得分:2)
当涉及到类类型时,当你创建一个const类型的临时表时,那个临时表将是const。当你创建一个非const类型的临时表时,那个临时表将是非const的。而已。即就确切的类型而言,const和临时工之间根本没有联系。类类型的临时性从不假定const本身。你可以明确地对它施加const。
在你的例子中,下界X(3)
和X(4)
都是常量。由于X(3)
不是const,因此可以在其上调用非const方法。
说X(4)
“表现为const”是不正确的。没有任何迹象表明它在你的例子中“表现为const”。仅仅因为你能够用某些东西初始化一个const引用并不意味着某些东西是const。
在你的问题中,你声明你“需要operator+
中的const参数”。那是不对的。您的operator+
中不需要const 参数。您的参数 x
被声明为const引用。 const引用可以很容易地绑定到const参数以及非const参数。在您的情况下,const引用参数x
绑定到非const临时参数X(4)
。
答案 2 :(得分:2)
历史上,临时值是右值,右值不是(也可能不是)
CV-合格。此规则适用于非类类型或类
没有成员函数的类型;因为const-ness介入功能
超载解析,临时的cv资格必须是
保持。如果函数只返回X
,则临时是
不是 const,你可以在其上调用非const函数;如果
函数返回X const
,然后临时是const,你不能
在其上调用非const函数。作为一般规则,它可能是
最好将类类型返回为const
;即X const f()
,而不是
比X f()
。但肯定有例外,没有机构这样做,
即使在更合适的情况下也是如此。最后,
在上下文中,您无法指定const-ness-function
样式类型转换,例如语法没有
提供一种指定cv限定符的方法(除了使用typedef)。
您可能希望查看以下代码的输出:
class C
{
std::string myComment;
public:
C( std::string const& comment ) : myComment( comment ) {}
void f()
{
std::cout << "Non const " << myComment << std::endl;
}
void f() const
{
std::cout << "Const " << myComment << std::endl;
}
};
typedef C const CC;
C
c()
{
return C("function return value");
}
C const
cc()
{
return C("function return value");
}
int
main()
{
C("function style conversion").f();
CC("function style conversion").f();
c().f();
cc().f();
}
答案 3 :(得分:1)
在以下代码中:
X x = X(3) + X(4);
X(3)
创建一个临时的非const对象,它调用operator+
,传递X(4)
这是另一个临时非const对象作为函数的const引用参数。
非const对象可以作为const对象传递给函数(通过引用传递),但是const对象不能通过非const引用传递给函数。差别就是这样。