建议here提出的std::make_array
函数的当前状态是什么?我找不到有关其潜在接受度的任何信息。根据{{3}},它位于std::experimental
命名空间中。 cppreference.com或C++ compiler support,Wikipedia-C++17和C ++ 17标准草案中都没有提及。
答案 0 :(得分:6)
LEWG投票赞成为C ++ 20 merge paper转发back in 2016(这是在C ++ 17功能冻结之后)。根据作者的要求,其LWG issue 2814的解决方案将暂停其LWG审核。
答案 1 :(得分:5)
正如@DeiDei所写,C ++ 17包含template argument deduction for classes,因此您现在可以编写:
std::pair p (foo, bar);
std::array arr = { 1, 2, 3, 4, 5 };
,依此类推。但是还有一些(有些微妙)的剩余用例,其中make_pair
或make_array
可能有用,您可以在Usefulness of std::make_pair and std::make_tuple in C++1z中阅读它们。
答案 2 :(得分:1)
此answer提供了提案的状态-但是-在C ++ 17中很容易实现-至少这部分:
[示例:
int i = 1; int& ri = i; auto a1 = make_array(i, ri); // a1 is of type array<int, 2> auto a2 = make_array(i, ri, 42L); // a2 is of type array<long, 3> auto a3 = make_array<long>(i, ri); // a3 is of type array<long, 2> auto a4 = make_array<long>(); // a4 is of type array<long, 0> auto a5 = make_array(); // ill-formed auto a6 = make_array<double>(1, 2); // ill-formed: might narrow –end example]
请参阅:
template <typename Dest=void, typename ...Arg>
constexpr auto make_array(Arg&& ...arg) {
if constexpr (std::is_same<void,Dest>::value)
return std::array<std::common_type_t<std::decay_t<Arg>...>, sizeof...(Arg)>{{ std::forward<Arg>(arg)... }};
else
return std::array<Dest, sizeof...(Arg)>{{ std::forward<Arg>(arg)... }};
}
证明:
int main() {
int i = 1; int& ri = i;
auto a1 = make_array(i, ri); // a1 is of type array<int, 2>
std::cout << print<decltype(a1)>().get() << std::endl;
auto a2 = make_array(i, ri, 42L); // a2 is of type array<long, 3>
std::cout << print<decltype(a2)>().get() << std::endl;
auto a3 = make_array<long>(i, ri); // a3 is of type array<long, 2>
std::cout << print<decltype(a3)>().get() << std::endl;
auto a4 = make_array<long>(); // a4 is of type array<long, 0>
std::cout << print<decltype(a4)>().get() << std::endl;
// auto a5 = make_array(); // ill-formed
// auto a6 = make_array<double>(1, 2); // ill-formed: might narrow
}
输出:
std::__1::array<int, 2ul>
std::__1::array<long, 3ul>
std::__1::array<long, 2ul>
std::__1::array<long, 0ul>
最后一行make_array<double>(1, 2)
产生“缩小转换”错误-根据提案的要求。通过在实现中添加static_cast可以对其进行“改进”。
在最新的叮当声中-demo。
答案 3 :(得分:0)
现在有一个实验性的make_array
。
https://en.cppreference.com/w/cpp/experimental/make_array
在标题
中定义<experimental/array>
template <class D = void, class... Types> constexpr std::array<VT /* see below */, sizeof...(Types)> make_array(Types&&... t);
(库基础知识TS v2)