Jon*_*ara 9 c++ templates const reference
考虑以下C++程序:
#include <iostream>
template<typename T>
class A
{
public:
explicit A(T& x) : x_(x){}
const T& get() { return x_; }
private:
T x_;
};
int main()
{
int x = 42;
A<int&>(x).get() = 43; // compiles fine, even though get() looks like it returns a const ref
std::cout << x << '\n';
}
Run Code Online (Sandbox Code Playgroud)
程序编译OK并输出43.这表明get()返回的看似const引用实际上是一个非const引用,因为它允许修改它引用的值.
是引用此行为的参考规则崩溃吗?
如何强制从get()返回的引用行为类似于const引用,也就是说,它不允许修改它引用的值?
Rak*_*111 10
是引用此行为的参考规则崩溃吗?
是的.你有:
T = int&
const T& = const (int&) &
Run Code Online (Sandbox Code Playgroud)
引用不能const(你无论如何都不能重新绑定它们,所以它被忽略了),对引用的引用只是一个引用.
所以你有了
const T& = int&
Run Code Online (Sandbox Code Playgroud)
要解决此问题,您需要应用const基础类型,您可以通过删除引用来执行此操作:
const std::remove_reference_t<T>& get() { return x_; }
// ^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
186 次 |
| 最近记录: |