【发布时间】:2013-10-18 04:59:54
【问题描述】:
我想使用 std::pair<bool, std::string> 的等价物作为函数返回类型。在下游代码中,最好使用ok 和msg 而不是first 和second 访问器,以避免不必要的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