使用临时对象有性能优势吗?

exp*_*ert 1 c++ boost boost-asio c++11

我正在审查Boost网站上的HTTP Server 3示例.连接类中有以下代码:

boost::tribool result;
boost::tie(result, boost::tuples::ignore) = request_parser_.parse(request_, buffer_.data(), buffer_.data() + bytes_transferred);
Run Code Online (Sandbox Code Playgroud)

其中,parse所申报

template <typename InputIterator>
boost::tuple<boost::tribool, InputIterator> parse(request& req, InputIterator begin, InputIterator end)
Run Code Online (Sandbox Code Playgroud)

我相信目标是将返回值复制tribool到局部变量.但是,boost::tie如果可以写一些类似的东西,那么通过临时对象()来做这件事有什么意义呢

boost::tuple<boost::tribool, char*> result = request_parser_.parse(request_, buffer_.data(), buffer_.data() + bytes_transferred);
// Our tribool is available via result.get<0>();
Run Code Online (Sandbox Code Playgroud)

Luc*_*lle 9

好处不是性能,而是实用性和可读性:因为您对返回的第二个对象不感兴趣parse,所以不需要保留它.最好完全忽略它,只获得你真正感兴趣的结果,即tribool.使用的以下代码result将更加清晰.

事实上,当一个函数返回多个数据时,通常有用(就可读性而言)将其"拆分"以分别获得各个元素.例如,考虑std::set<T>::insert,它返回元素的迭代器以及指示它是否是新插入的布尔值.您发现以下哪个代码更清晰:

std::set<int> s;
std::pair<std::set<int>::iterator, bool> res = s.insert(42);

if (res.second)
{
    doSomething(res.first);
}
Run Code Online (Sandbox Code Playgroud)

VS

std::set<int> s;
std::set<int>::iterator itInsertedElement;
bool isNewlyInserted;

tie(itInsertedElement, isNewlyInserted) = s.insert(42);

if (isNewlyInserted)
{
    doSomething(itInsertedElement);
}
Run Code Online (Sandbox Code Playgroud)

在我看来,后者更容易阅读.