gpt4 book ai didi

C++ 模板显式右值类型

转载 作者:行者123 更新时间:2023-12-02 01:43:30 25 4
gpt4 key购买 nike

#include <iostream>

using namespace std;

namespace mine {

template <typename T>
struct remove_rval {
using type = T;
};

template <typename T>
struct remove_rval<T&&> {
using type = T;
};

template <typename T>
void g(const T& = typename remove_rval<T>::type())
cout << __PRETTY_FUNCTION__ << endl;
}
}

int main()
{

mine::g<int&&>(); // doesn't work, because of explicit template?
const int& i2 = mine::remove_rval<int&&>::type(); // works, sanity check

return 0;
}

我写的函数模板无法编译。根据我对 C++ 的理解,您可以将右值分配给常量左值引用。但是,在这种情况下,就像推导类型在分配函数默认值时忽略“const”限定符一样。这是为什么?

最佳答案

来自dcl.ref/p6 :

If a typedef-name ([dcl.typedef], [temp.param]) or a decltype-specifier ([dcl.type.decltype]) denotes a type TR that is a reference to a type T, an attempt to create the type lvalue reference to cv TR creates the type lvalue reference to T, while an attempt to create the type rvalue reference to cv TR creates the type TR.

因此,在您的示例中,T = int&& : const T&折叠为T& (即 int& )并且不是 const T& (即 const int& )根据上面引用的声明。因为我们无法绑定(bind)像 remove_rval<T>::type() 这样的右值对于非常量左值引用,您会收到上述错误。

因此,即使 g 中函数参数的形式是对 const T 的引用 又名 const 左值引用(即 const T& ),第一次调用 g 实例化 g 引用非常量 T 又名非常量左值引用(即 T& = int& )作为参数:

template<>
void g<int &&>(int&)
{
//operator<< called here
}

由于参数是int& ,我们不能绑定(bind)像 remove_rval<int&&>::type() 这样的右值到该参数。

关于C++ 模板显式右值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71240646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com