gpt4 book ai didi

c++ - Ref 限定的成员函数设计打破了 const rvalues

转载 作者:搜寻专家 更新时间:2023-10-31 02:24:31 26 4
gpt4 key购买 nike

我有一个 Maybe类,它是一个基于堆栈的类,可能包含给定的类型。我们有一些返回 Maybe 的函数包含可变或常量引用。这主要是为了减少样板文件、查找和不需要的拷贝。

Map<String, Foo> map;

// Normal C++
auto it = map.find("foo");
if (it != map.end())
doStuff(*it);

// Has an extra lookup, bad
if (map.contains("foo"))
doStuff(map.get("foo"));

// Uses Maybe
if (auto val = map.maybe("foo"))
doStuff(*val);

// Also possible:
// apply calls the function with *this as argument if this is valid
map.maybe("foo").apply(&doStuff);

但是,当 map 时,这是有问题的是临时的:

Map<String, Foo> map;
Map<String, Foo> getMap() { return map; } // Returns a copy of map

if (auto val = getMap().maybe("foo")) // Returns Maybe<Foo&> to temporary
doStuff(*val); // Very bad, *val has already been deleted

另一方面,因为 Maybe<Foo>可从 Maybe<Foo&> 构建(一般来说,Maybe<T2> 是从 Maybe<T> 构造的,如果 T2 是从 T 构造的)那么如果我写这个,这不是问题。

if (Maybe<Foo> val = getMap().maybe("foo"))
doStuff(*val); // OK, val contains a copy

在一位同事无意中遇到这个问题后,我灵机一动,在可能返回 Maybe<T&> 的地方使用 ref-qualified 成员函数。返回 Maybe<T>相反,如果它是右值。

Maybe<Val> Map<Key, Val>::maybe(Key const& key) &&;
Maybe<Val const&> Map<Key, Val>::maybe(Key const& key) const&;
Maybe<Val &> Map<Key, Val>::maybe(Key const& key) &;

但是对于 const&&; 的情况,我不知道该怎么做

如果没有,它会调用 const& version,这是不好的,因为它会返回一个引用。

我考虑过制作 &&版本 a const&&避免重复的版本;但是,那么我需要复制,而不是移动内部值。而且我对 const&& 的语义了解不够知道const_cast是否可以接受在内部,或者当我改变 const&& 时这会导致疯狂和歇斯底里吗? .如果不需要,我宁愿不必编写此函数的两个拷贝。

在这种情况下,正常的最佳做法是什么?我需要编写所有 4 个函数吗?或者我可以理智地离开 3 吗?

是否有更好的方法来避免这种悬空引用问题?这只是一个问题,因为 auto通常会去掉引用,所以你不会不小心引用一个临时的,但是因为 Maybe 的类型已经是一个普通值,它只是包装了一个引用类型,搬起石头砸自己的脚。只是说“那么在那种情况下不要使用 auto”是非常诱人的,但仍然很容易不小心搞砸,我宁愿做错事也很难。

最佳答案

无论如何,您都不可能在好的代码中获得 const&&

唯一的办法是

  1. 调用返回const T 的函数。 (无论如何,拥有这样的返回类型并不是一个好主意。)
  2. 调用返回const T&& 的函数。 (同上。)
  3. 故意转换为 const&&。 (无论如何你都不会这样做。)
  4. && 的隐式转换。 (这不会发生,因为您有一个通过右值引用接受的重载。)

因此,如果您想对 API 进行防弹,正确的方法就是删除-ing 重载:

Maybe<Val &> maybe(Key const& key) const&& = delete;

关于c++ - Ref 限定的成员函数设计打破了 const rvalues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27973279/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com