gpt4 book ai didi

c++ - 这个返回声明中发生了什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:50 24 4
gpt4 key购买 nike

我正在阅读复制省略(以及它应该如何在 C++17 中得到保证),这让我有点困惑(我不确定我是否知道我以前认为我知道的事情)。所以这是一个最小的测试用例:

std::string nameof(int param)
{
switch (param)
{
case 1:
return "1"; // A
case 2:
return "2" // B
}
return std::string(); // C
}

在我看来,案例A和案例B对返回值执行直接构造,因此复制省略在这里没有意义,而案例C不能执行复制省略,因为有多个返回路径。 这些假设是否正确

我也想知道

  • 有一种更好的方式来写上面的内容(例如,有一个 std::string retval; 并且总是返回那个或者写 case AB as return string("1") 等)
  • 有任何移动发生,例如 "1" 是临时的,但我假设它被用作 std::string 的构造函数的参数>/li>
  • 我忽略了一些优化问题(例如,我相信 C 可以写成 return{},那会是更好的选择吗?)

最佳答案

为了使其对 NRVO 友好,您应该始终返回相同的对象。对象的值可能不同,但对象应该是相同的。

但是,遵循上述规则会使程序更难阅读,通常人们应该选择可读性而不是不明显的性能改进。由于 std::string 定义了移动构造函数,因此移动指针和长度与不移动指针和长度之间的区别非常小,以至于我看不到在应用程序中实际注意到这一点。

至于你的最后一个问题,return std::string()return {} 是完全一样的。

你的问题中也有一些不正确的陈述。例如,"1" 不是临时的。这是一个字符串文字。临时是从这个文字创建的。

最后但同样重要的是,强制性 C++17 复制省略不适用于此处。它保留用于类似

的情况
std::string x = "X";

在强制要求可以生成代码以创建临时 std::string 并使用复制(或移动)构造函数初始化 x 之前。

关于c++ - 这个返回声明中发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41730222/

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