В рамках более крупного проекта я играю с 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;
}
Согласно этот ответ C++17 поддерживает инициализацию кортежа из copy-list-initialization, однако кажется такая поддержка ограничена, так как я получаю следующую ошибку (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
^
Можно ли в этом сценарии использовать синтаксис, заключенный в фигурные скобки?
Some Context : это будет использоваться в перегрузке оператора, поэтому я предполагаю, что я привязан к кортежам и не могу использовать вариации, любой намек хорошо принят.
Дополнительно: 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) {}