Sam*_*eri 8 c++ initializer-list variadic-templates uniform-initialization c++17
作为一个更大项目的一部分,我正在玩std::tuple模板; 考虑以下代码:
template <typename ...T> void foo(tuple<T...> t) {}
void bar(tuple<int, char> t) {}
tuple<int, char> quxx() { return {1, 'S'}; }
int main(int argc, char const *argv[])
{
foo({1, 'S'}); // error
foo(make_tuple(1, 'S')); // ok
bar({1, 'S'}); // ok
quxx(); // ok
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据这个答案, C++ 17支持从复制列表初始化开始的元组初始化,但是由于我得到以下错误(GCC 7.2.0),所以似乎这种支持是有限的:
main.cpp: In function 'int main(int, const char**)':
main.cpp:14:17: error: could not convert '{1, 'S'}' from '<brace-enclosed initializer list>' to 'std::tuple<>'
foo({1, 'S'}); // error
^
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我有什么方法可以使用大括号括起来的句法吗?
一些上下文:这将在运算符重载中使用,所以我猜我已经绑定了元组并且无法使用可变参数,任何提示都被广泛接受.
额外:Clang 6也抱怨
prog.cc:12:5: error: no matching function for call to 'foo'
foo({1, 'S'}); // error
^~~
prog.cc:6:31: note: candidate function [with T = <>] not viable: cannot convert initializer list argument to 'tuple<>'
template <typename ...T> void foo(tuple<T...> t) {}
Run Code Online (Sandbox Code Playgroud)
一个支撑,初始化列表,如{1, 'S'},实际上并没有一个类型.在模板推导的上下文中,您只能在某些情况下使用它们 - 在推导时initializer_list<T>(在哪里T是函数模板参数)或者相应的参数已经被其他东西推断出来.在这种情况下,这两件事都不是真的 - 所以编译器无法弄清楚...T应该是什么.
所以你可以直接提供类型:
foo<int, char>({1, 'S'});
Run Code Online (Sandbox Code Playgroud)
或者你可以构建tuple自己并将其传递给:
foo(std::tuple<int, char>(1, 'S')); // most explicit
foo(std::tuple(1, 'S')); // via class template argument deduction
Run Code Online (Sandbox Code Playgroud)
今天,ClassTemplate<Ts...>只能从ClassTemplate<Us...>继承自类似内容的类型或类型的表达式推断出来.假设的提议可以扩展到另外尝试对表达式执行类模板参数推断以查看该推导是否成功.在这种情况下,{1, 'S'}不是一个,tuple<Ts...>但tuple __var{1, 'S'}成功推断,tuple<int, char>以便工作.这样的提议还必须解决诸如......如果我们推断ClassTemplate<T, Ts...>或任何微小的变化,这不是类模板参数演绎允许的内容(但许多人有时表示有兴趣能够去做).
我今天不知道这样的建议.
| 归档时间: |
|
| 查看次数: |
3227 次 |
| 最近记录: |