C++-C++临时对象是const类型还是非const类型?

发布于 2017-01-29 08:20:51 字数 42 浏览 1151 评论 6

RT,C++中创建出的临时对象是const类型还是非const类型呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

归属感 2017-10-12 22:06:56

C++中创建出的临时对象都是const类型的,《More effective C++》里面对这个问题讲得很清楚(M19:理解临时对象的来源)

下面有一个小例子:

string foo( );
void bar(string & s);

那么下面的表达式将是非法的:

 bar(foo( ));
bar("hello world");

原因在于 foo( ) 和 "hello world" 串都会产生一个临时对象,而在 C++ 中,这些临时对象都是 const 类型的。因此上面的表达式就是试图将一个 const 类型的对象转换为非 const 类型,这是非法的。引用型参数应该在能被定义为 const 的情况下,尽量定义为 const 。

灵芸 2017-09-13 07:50:22

 class A{};
A foo(){return A();}
int main()
{
A& r = foo();
return 0;
}

你有这样的疑问大概是遇到了上述代码,在VS系列的编译器,默认的编译选项下是可以编译通过的。这只是VS编译器的在C++标准上的一个扩展。只要加上/Za选项停止所有的扩展,就会发现编译器报错了。
毫无疑问,临时对象,必然有const属性。

瑾兮 2017-09-12 07:27:13

有一个简单的方法可以很容易分辨这个问题。
首先,const 类型是不能作为左值的,非 const 类型才可以作为左值。
而临时对象也是不能作为左值的,所以临时对象是 const 类型。

清晨说ぺ晚安 2017-05-22 03:46:50

《Thinking in C++》一书中写到"there is one thing about temporaries: they’re automatically const. Because you usually won’t be able to get your hands on a temporary object, telling it to do something that will change that temporary is almost certainly a mistake because you won’t be able to use that information. By making all temporaries automatically const, the compiler informs you when you make that mistake."

虐人心 2017-05-18 14:43:05

C++中的临时对象都是const类型的,如下代码

class A {};
class B
{
public:
B(){}
B(A& a){}
};
class C: public B
{
public:
C(B& b) : B(b)
{}
};
int main()
{
A a;
B b(a);
C c(a);
return 0;
}

如上这段代码,是编译不过的,而把C(B& b) : B(b)这一句改为C(const B& b) : B(b)时,是可以编过的。可以说明产生的临时对象是const类型的,因为如果也是non-const类型,那么当形参为B &b时,传入一个const类型是会报错的

想挽留 2017-02-04 01:31:38

1楼的例子,不能说明临时对象就是const的吧。
例如:
class A {
public:
A() {}
A(int i) : _i(i) {}
//A(A& other) : _i(other._i) {}
private:
int _i;
};
const A& aa = 3; //这个过程中会去构造临时对象,同理如果是C(const B& b) 也会有这么个过程。
过程大概是这样的。
A tem = A(3);
const A& aa = tem;
声明为const的对象引用类型才会产生临时对象。并赋值给const引用。如果不是const的,是不会有这个过程。
A& a = 3;//编译错误。

最后实践了一下,修正上次的错误,临时对象是const的。
A(A& other) : _i(other._i) {} 如果加上这句。
A tem = A(3); //编译错误~。

参考 《C++程序设计语言》 引用一节 P89页。
对一个const T&的初始式不必是一个坐直,甚至可以不是类型T的。在这种情况下
1.首先,将应用到T的隐式类型转换
2.而后将结果存入一个类型T的临时变量。
3.最后,将此临时变量用初始式的值。
引用分为变量引用和常量引用。
这种保存引用的临时变量将一直存在,直到这个引用的作用域结束。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文