gpt4 book ai didi

c++ - 带有 ref 限定符的 getter 的最佳实践

转载 作者:行者123 更新时间:2023-12-04 11:33:19 25 4
gpt4 key购买 nike

以下代码会导致未定义的行为:

class T
{
public:
const std::string& get() const { return s_; }

private:
std::string s_ { "test" };
}

void breaking()
{
const auto& str = T{}.get();
// do sth with "str" <-- UB
}
(因为 const& 的生命周期延长在这里不适用,因为这是我的理解)。
为了防止这种情况,一种解决方案可能是向 get() 添加引用限定符。防止在 LValues 上调用它:
const std::string& get() const & { return s_; }
但是,因为现在的函数都是 const&符合条件的,还可以拨打 get()在 RValues 上,因为它们可以分配给 const& :
const auto& t = T{};        // OK
const auto& s1 = t.get(); // OK
const auto& s2 = T{}.get(); // OK <-- BAD
防止这种情况的唯一方法(据我所知)是重载 get()&& - 不返回引用或到 = delete 的限定变体它:
const std::string& get() const &  { return s_; }

const std::string& get() const && = delete; // Var. 1
std::string get() const && { return s_; }; // Var. 2
但是,这意味着要实现正确返回(const)引用的 getter 函数,我总是必须提供 Var。 1 或 2.,这相当于很多样板代码。
所以我的问题是:
是否有更好/更简洁的方法来实现返回引用的 getter 函数,以便编译器可以识别/防止提到的 UB 案例?还是我对问题的理解存在根本性缺陷?
另外,到目前为止我找不到添加 & 的例子。到 const成员函数带来了任何好处,而无需处理 &&重载...也许任何人都可以提供一个,如果存在的话?
(我在 MSVC 2019 v142 上使用 C++17,如果这有什么不同的话)
感谢你并致以真诚的问候

最佳答案

有点不清楚您正在使用哪些限制。如果它是一个选项,你可以摆脱 getter(s),并让生命周期延长做它的事情:

struct T
{
std::string s_ { "test" };
};

const auto& str = T{}.s_; // OK; lifetime extended

使用 getter,您可以选择 1. 提供重复的 getter 或 2. 接受调用者必须小心不要假设来自临时 getter 的引用仍然有效。如问题所示。

通过使用共享所有权,您可以保留私有(private)访问权限,同时仍然可以轻松进行生命周期管理:
class T
{
std::shared_ptr<std::string> s = std::make_shared<std::string>("test");
public:
// alternatively std::weak_ptr
const std::shared_ptr<const std::string>
get() const {
return s;
}
};
但是您必须考虑运行时成本是否值得轻松。

关于c++ - 带有 ref 限定符的 getter 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68892220/

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