我有以下代码。

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/

10-11 22:42