【问题标题】:Custom accessor names in a specialised pair [closed]专用对中的自定义访问器名称[关闭]
【发布时间】:2013-10-18 04:59:54
【问题描述】:

我想使用 std::pair<bool, std::string> 的等价物作为函数返回类型。在下游代码中,最好使用okmsg 而不是firstsecond 访问器,以避免不必要的API 查找。而且我似乎无法使用继承正确编写它,因为std::pair 可能会在没有虚拟析构函数的情况下泄漏。想要避免我自己的结构作为Renamed std::pair members 中的解决方案 - 重用现有的 Move 构造函数和其他管道。有可能吗?

编辑:

反馈后好像是推荐的方法是:

struct res {
    bool ok;
    std::string msg;
};

res fnk() { ...; return r };

我是否正确理解 C++11 编译器期望生成移动构造函数以避免复制字符串?

【问题讨论】:

  • 编译器为您提供所有必要的管道。您没有免费获得的是关系运算符和 std::make_pair 等价物。
  • 这取决于你如何调用函数,但最可能的情况是你得到复制省略。但是编译器会为你生成一个移动复制构造函数和一个移动复制赋值运算符(除非你定义了自己的构造函数,在这种情况下你可以使用default重新启用它们。参见here)。
  • 我不认为在这种情况下缺少虚拟析构函数会成为问题......
  • 您正在更改语义:您返回的是值,而不是引用,并且您不能在 const res 实例上或通过 const 引用或指针调用该方法。至于好处,与struct res {bool ok; std::string msg;};相比,我看不出你有什么收获。
  • @VladDidenko 回应您的编辑:是的,情况甚至更好:编译器有望在适当的位置创建返回值!这意味着即使是(否则非常便宜的)举动也可以避免。

标签: c++ visual-c++ c++11


【解决方案1】:

想避免我自己的结构作为Renamed std::pair members 中的解决方案 - 重用现有的 Move 构造函数和其他管道。

我认为这是误解的根源:如果您编写自己的结构,the compiler will generate the move constructor 和“其他管道”为您免费。

而且任何像样的编译器都应该能够做到copy elision,也就是在原地构造结果;没有复制,没有移动。

使用命名的内联访问器也是一种选择,尤其是如果您真的需要使用std::pair;在Renamed std::pair members问题和in one of the answers中也有详细说明。

在我看来,在这种情况下进行继承是错误的;我不会那样做的。我看不出它有什么好处,但我确实看到了它的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多