首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过参考传递创建的“动态”对象

通过参考传递创建的“动态”对象
EN

Stack Overflow用户
提问于 2013-01-17 09:17:18
回答 2查看 746关注 0票数 2

如果这个问题已经被回答的话,我很抱歉--我已经搜索过了,但是这是一个很难找到的搜索词,因为通过引用传递更多的一般性问题。

我遇到的问题是,当我编译这类东西时,会收到第4级的警告:

代码语言:javascript
运行
复制
class MyClass
{
public:
    MyClass() {};
};

void DoSomethingToMyClass(MyClass& my_class_reference);


void MyRoutine()
{
    DoSomethingToMyClass(MyClass());
};

警告(C4239)基本上表示从实例到引用存在一个不可靠的强制转换。我从仔细的检查中学到了不要注销4级警告,因为他们中的许多人在我(和其他人)的代码中发现了错误,比如返回-1作为一个size_t (知道size_t(-1)实际是什么的额外积分)。

有人能向我解释一下上面的代码会做什么吗?我最偏执的理论是:

  • MyClass()的实例是动态创建的,但没有给出适当的句柄。
  • 然后,在my_class_reference基准上执行的操作会出错.

另一个极端是C4239总是可以被忽略.

*[类似的情况是某人缺省引用:

代码语言:javascript
运行
复制
void DoSomethingToMyClass(MyClass& my_class_reference=MyClass());

这会产生相同的警告,但在另一个主题中会部分讨论。]*

编辑:

谢谢你的快速反应,伙计们。对不起:应该在Visual中提到它是VC++。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-17 09:19:18

您会得到警告,因为这不是标准的C++,而是允许您将临时人员绑定到非const引用的MS扩展。

不要。要么有一个const引用的参数:

代码语言:javascript
运行
复制
void DoSomethingToMyClass(const MyClass& my_class_reference);

这在这里可能不适用,顾名思义,方法会改变类,或者预先创建对象:

代码语言:javascript
运行
复制
MyClass x;
DoSomethingToMyClass(x);
票数 8
EN

Stack Overflow用户

发布于 2013-01-17 09:18:56

您正在通过MyClass()创建一个临时无名对象,并且按照C++标准,临时对象不能绑定到非常量引用。因此发出了警告。

有些编译器确实允许将其作为语言扩展。

因此,要么是:

您需要更改您的接口以接受const引用来绑定到一个临时的。

代码语言:javascript
运行
复制
void DoSomethingToMyClass(const MyClass& my_class_reference)
                          ^^^^^^^

或者,不要传递临时无名对象,传递命名对象。

代码语言:javascript
运行
复制
void DoSomethingToMyClass(MyClass& my_class_reference);

Myclass obj;
DoSomethingToMyClass(obj);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14375640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档