临时表现不像常

时间:2011-11-16 09:08:04

标签: c++ const temporaries

我不清楚临时是否假定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参数)。

有人可以澄清一下,正确的理解是什么?

4 个答案:

答案 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引用传递给函数。差别就是这样。