下面的代码编译和工作,因为我希望它与叮当声和gcc,但给Visual Studio 2015 RTM的错误。我认为clang和gcc是正确的,但我不确定。这个代码应该编译?模板参数推导和默认模板参数
#include <iostream>
#include <type_traits>
#include <utility>
template <typename T, size_t N, typename IS = decltype(std::make_index_sequence<N>{})>
struct Vector {
T e_[N];
};
template <typename T, typename U, size_t N, size_t... Is>
constexpr auto operator+(const Vector<T, N, std::index_sequence<Is...>>& x,
const Vector<U, N>& y) {
using V = std::common_type_t<T, U>;
return Vector<V, N>{x.e_[Is] + y.e_[Is]...};
}
int main() {
const auto v0 = Vector<float, 4>{1, 2, 3, 4};
const auto v1 = Vector<float, 4>{5, 6, 7, 8};
const auto v2 = v0 + v1;
for (auto x : v2.e_) std::cout << x << ", ";
std::cout << std::endl;
}
的Visual Studio编译此行如果我改变运营商+到:
template <typename T, typename U, size_t N, size_t... Is>
constexpr auto operator+(const Vector<T, N, std::index_sequence<Is...>>& x,
const Vector<U, N, std::index_sequence<Is...>>& y);
但我不认为它应该有必要再次把std::index_sequence<Is...>
为y
。
除非我遗漏了某些东西,'decltype(std :: make_index_sequence {})'完全是无意义的,应该是'std :: make_index_sequence '。 –
orlp
@orlp好点。不知道我是如何错过的 - 我正在重构真正的代码,这是从那里提取出来的。有趣的是,改变它会让问题在VS2015中消失。 – mattnewport
那么这是一个编译器错误,因为尽管无关紧要,它们应该是等价的。 – orlp