在类中存储对对象的const引用

米哈伊尔

这听起来像是一个基本问题,但是我没有找到任何全面的答案,所以就在这里。考虑以下代码片段:

struct A {
    const std::string& s;
    A(const std::string& s) : s(s) {}
};

int main() {
    A a("abc");
    std::cout << a.s << std::endl;
    return 0;
}

演示

据我了解,这是UB。字符串文字“ abc”绑定到const std::string&构造函数中,从而创建一个临时字符串对象。它也必须绑定到reference a.s,并且一旦a构造就将其销毁也就是说,const reference不能链接生命周期延长。悬空参考,繁荣。在这种情况下,我在ideone.com上根本看不到任何输出,但是任何事情都会发生(记住velociraptors)。

好的,这很清楚。但是,如果这实际上是我们的意图:我们想存储对对象的const引用怎么办?对于现有的,不是临时的?听起来这是很自然的任务,但是我只想出了一个(几乎)自然的解决方案。通过std::reference_wrapper而不是通过引用来接受构造函数的参数

    A(std::reference_wrapper<const std::string> r) : s(r) {}

由于std::reference_wrapper已从临时成员中删除了构造函数:

reference_wrapper( T&& x ) = delete;

就像预期的那样工作。但是,这不是很优雅。我可以想到的另一种方法是接受转发引用T&&并拒绝除const l值字符串之外的所有内容std::enable_if我认为,这甚至没有那么优雅。

还有其他方法吗?

UPD另一个问题:这是的合法用法std::reference_wrapper,还是可能被认为过于具体?

Angew不再为SO感到骄傲

我想说,自然的解决方案是做什么reference_wrapper:阻止临时构建:

struct A {
    const std::string& s;
    A(const std::string& s) : s(s) {}
    A(std::string&&) = delete;
};

您还应该记住,默认情况下,具有引用类型的数据成员会使该类不可分配(甚至无法进行移动分配),并且通常很难实现分配运算符。您应该考虑存储指针而不是引用:

struct A {
    const std::string* s;
    A(const std::string& s) : s(&s) {}
    A(std::string&&) = delete;
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将对对象的引用存储在ArrayList中

来自分类Dev

返回对对象的const引用

来自分类Dev

将对对象属性的引用存储在变量中

来自分类Dev

如何从方法返回对对象的const引用?

来自分类Dev

如何在System.DataTable中存储对对象的引用,而不是字符串?

来自分类Dev

我们如何在指针中存储对对象的引用?

来自分类Dev

在对基类的引用中存储派生类的对象

来自分类Dev

const引用ostream类对象

来自分类Dev

在Java中对对象的双重引用

来自分类Dev

在python类中对对象执行计算

来自分类Dev

访问存储在变量引用的类对象中的变量

来自分类Dev

从基类获取对对象的引用。装饰器设计模式

来自分类Java

打印对对象的引用

来自分类Dev

创建对对象的引用

来自分类Dev

在c ++中,删除对象时清除对对象的引用

来自分类Dev

使用typecast在unique_ptr中创建对对象的引用

来自分类Dev

返回对对象列表的引用

来自分类Dev

跟踪对对象实例的引用

来自分类Dev

VBA和对对象的引用

来自分类Dev

从类中的对象引用外部 this

来自分类Dev

在Java中引用类对象

来自分类Dev

如何引用存储在对象中的对象

来自分类Dev

存储类中的对象列表

来自分类Dev

对对象的引用不会更新对象

来自分类Dev

在const对象中初始化引用

来自分类Dev

如何将对象的引用存储在另一个类 C++ 中?

来自分类Dev

如何在通用类数组列表中存储对象并按名称引用Java-Homework

来自分类Dev

将const存储在结构或静态类中

来自分类Java

如何在Java中存储对类的引用?