使用花括号初始化std ::元组元组

时间:2016-01-10 17:58:47

标签: c++ c++11

这可能有一个非常简单的答案,但我真的无法弄明白。为什么我这样做会出错?什么是正确的初始化方式?

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>"

1 个答案:

答案 0 :(得分:24)

这是 $(function () { $('a[href*=#]:not([href=#])').click(function () { if (location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') && location.hostname == this.hostname) { var hrefLink = $(this).attr('href'); var str = document.URL; var n = str.lastIndexOf('#'); var result = str.substring(0, n + 1); var target = $(this.hash); target = target.length ? target : $('[name=' + this.hash.slice(1) + ']'); $("html, body").animate({ scrollTop: target.offset().top }, "slow"); history.pushState(document.URL, '', ""); return false; } }); }); 的一个突出问题。见its constructor in C++11/14 is explicit。因此,它不能参与copy-list-initialization,这是内部braced-init-lists所做的(外部的是直接列表初始化)。

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

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