繁体   English   中英

我可以确保只有引用变量可以接受 function 的结果吗?

[英]Can I make sure that only reference variable can accept the result of a function?

假设我有这个 function

class Entity;

Entity& CreateEntity(){
    Entity* e = new Entity();
    entityVec.emplace_back(e);
    return *e;
}

目前,下面的两个代码都可以编译。

Entity a = CreateEntity();
Entity& b = CreateEntity();

但是,我想确保只有一个引用变量可以接受 function 的结果。否则,代码会有很多意想不到的行为。

换句话说,有什么方法可以让Entity a = CreateEntity()抛出错误,而只允许Entity& b = CreateEntity()吗?

如果没有,是否有任何方式或模式可以强制执行?

谢谢。

我希望对此有一个编译器警告。 因为您要解决的问题是对性能的真正关注,尤其是在使用 STL 时。

Microsoft 代码分析可能是您正在寻找的: https: //devblogs.microsoft.com/cppblog/new-safety-rules-in-c-core-check/https://learn.microsoft.com/en-us /cpp/代码质量/c26820?view=vs-2019

如果您控制着 class,您担心在此处复制是一个可能的解决方案。 解决方法是简单地删除复制构造函数/operator=。 我写了一个宏来做这个:

// Disallow the use of the copy constructor and copy assignment operator for a class:
// Note: prefer to place this in public for better compiler error messages (Scott Meyers Effective C++)
#define UTIL_DELETE_COPY_AND_ASSIGN(udt)       \
    udt(const udt&)             = delete; \
    udt& operator =(const udt&) = delete;
class foobar
{
public:
    UTIL_DELETE_COPY_AND_ASSIGN(foobar);
}

如果您仍然想保留复制构造函数/分配功能,您可以简单地制作这些函数的更明确的版本,以便用户知道他们得到了什么。

class foobar
{
public:
    foobar DeepCopy(); {...}
    UTIL_DELETE_COPY_AND_ASSIGN(foobar);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM