我更喜欢,
std::tuple<bool, std::string, int> f()
{
...
return { false, "home", 0 };
}
编辑 1
上面的代码实际上是在 clang/libc++ 主干下为我编译的。正如@AndyProwl 在评论部分所评论的那样,这不应该因为 std::tuple 构造函数是显式的,并且通过初始化列表语法返回是在复制初始化上下文中,因此复制列表初始化,当显式构造函数匹配时会失败。
我不知道 clang/libc++ 通过的原因,我想它是 libc++ 中的一个错误。无论如何,对于元组无法做到这一点很遗憾......
我想我意识到(对我来说,最后)它是多么悲伤,一般来说。我已经习惯了这种语法,但是人们不得不事先知道返回类型是否包含一个显式的构造函数以便它工作。
编辑 2
这确实是一个 libc++ 扩展,有关更多信息,请在此处查看 Howard Hinnant 的回答:https ://stackoverflow.com/a/14963014 。
它目前也在 libc++ 错误列表中打开: http://llvm.org/bugs/show_bug.cgi?id= 15299。
这是相关的建议:Daniel Krügler,改进对和元组。
简而言之,这就是 libc++ 发生的情况:
#include <tuple>
#include <string>
struct S
{
explicit S(int) {}
};
int main()
{
std::tuple<int, std::string> t1 = { 1, "hello" }; // ok
std::tuple<std::string> t2 = "hello"; // ok
std::tuple<int, S> t3 = { 1, 1 }; // fail: an *element* is to be constructed explicitly
}