我有以下代码。
template <typename... Types>
void print_tuple(const std::tuple<Types&&...>& value)
{
std::cout << std::get<0>(value) << "," << std::get<1>(value) << std::endl;
}
print_tuple(std::forward_as_tuple("test",1));
哪个编译器提示
error: invalid initialization of reference of type ‘const std::tuple<const char (&&)[5], int&&>&’ from expression of type ‘std::tuple<const char (&)[5], int&&>’
print_tuple(std::forward_as_tuple("test",1));
为什么编译器将元组中第一个元素的类型推导为const char(&&)[5]?
最佳答案
一般而言,为使推论成功,参数必须具有与参数相同的一般形式。在某些异常(exception)情况下,可以从T &&
推断出U &
(通过选择T = U &
),但是在这种情况下未指定此类异常(exception)。
尚不清楚,但这需要P
(参数)和A
(参数)具有相同的形式。它们必须都是T&
形式,或者都必须是T&&
形式。可以从T &&
推导U &
的异常(exception)情况是在有限的情况下,通过在匹配之前将T &&
更改为纯T
来完成的:
和
但没有类似的异常(exception)情况适用于您的情况。
正是这条相同的原则
template <typename T> struct S { };
template <typename T> void f(S<const T>) { }
int main() { f(S<void()>()); }
无效:const T
不能从void()
推断出,即使T = void()
会给出确切的结果,并且调用f<void()>
也会成功。Wintermute的已删除答案表明您可以使用
相反:根据
Types
的类型,这允许将value
推导为左值引用,右值引用或非引用。关于c++ - 推导c++ 11中的元组元素的类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29183791/