【问题标题】:Initialize an std::array of tuples with curly braces用花括号初始化一个 std::array 元组
【发布时间】:2016-01-10 17:58:46
【问题描述】:

这可能有一个非常简单的答案,但我真的想不通。为什么这样做会出错?初始化这样的东西的正确方法是什么?

std::array<std::tuple<int, std::string>, 3> tuples{
    {3, "a"},
    {7, "b"},
    {2, "c"}
};

在 MSVC 2015 上,我收到以下错误:

No suitable constructor exists to convert from "int" to "std::tuple<int, std::string>"
No suitable constructor exists to convert from "const char[2]" to "std::tuple<int, std::string>"

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    这是tuple 的一个突出问题。见,its constructor in C++11/14 is explicit。因此,它不能参与复制列表初始化,这是内部花括号初始化列表所做的(外部是直接列表初始化)。

    这个想法是prevent you from being able to bypass a class's explicit constructors through tuple。但是,在 C++17 中,这将被改变:如果所有元组的类型本身都可以从各自的给定类型隐式转换,那么 tuple 的构造函数也将如此。

    对于您的特定用例,您可以使用 std::pair。它的构造函数永远不会是explicit

    【讨论】:

    • 这就是为什么在我发布之前,其他人删除的答案实际上有效。我想那可能会做一些我没想到的事情。猜猜我将不得不使用 C 数组,或者那样做。呃……C++17 来得不够快
    • @AlexYan:你可以使用pair,因为你当前的类型只有两个成员。
    • 这个想法是为了防止你能够通过元组绕过类的显式构造函数”你有讨论过的地方的参考吗?
    • 你知道这叫什么功能吗?只是好奇当前的编译器是否支持它
    • @AlexYan:我怀疑这有一个正式的名称。但是the most recent paper discussing it is N4387.
    猜你喜欢
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2017-06-30
    相关资源
    最近更新 更多