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