我正在追踪一个我无法弄清楚的C ++编译器错误。我已将其缩减为此代码:
#include <boost/config.hpp>
#include <boost/type_traits/remove_reference.hpp>
template<typename T> inline const T bar( T in )
{
typedef BOOST_DEDUCED_TYPENAME boost::remove_reference<T>::type nonref;
const nonref* inPtr = ∈
return *inPtr;
}
class Foo
{
};
int main()
{
Foo foo;
const Foo& ref = bar< Foo& >( foo );
}
导致:
tt.cpp: In function ‘const T bar(T) [with T = Foo&]’:
tt.cpp:19:39: instantiated from here
tt.cpp:9:13: error: invalid initialization of reference of type ‘Foo&’ from expression of type ‘const nonref {aka const Foo}’
这里的实际问题是什么?为什么返回值中缺少const?我需要remove_reference,因为实际代码需要它。
答案 0 :(得分:3)
将const
应用于引用类型不会执行任何操作。您需要创建模板参数const foo &
,否则删除引用,然后在函数签名本身中添加const
和引用。
另见When should I use remove_reference and add_reference?,特别是第二段。
答案 1 :(得分:1)
使用VisualStudio 2008我收到以下错误
error C2440: 'return' : cannot convert from 'const nonref' to 'Foo &'
将球改为
template<typename T> inline const typename boost::remove_reference<T>::type& bar( T in )
{
typedef BOOST_DEDUCED_TYPENAME boost::remove_reference<T>::type nonref;
const nonref* inPtr = ∈
return *inPtr;
}
修复此问题并编译代码。
答案 2 :(得分:0)
从您的函数返回const T
并不符合您的预期。从您的代码中我了解到您希望它返回const Foo&
,这是对类型为Foo
的不可变对象的引用。
但当T
为Foo&
时,表达式const T
表示对类型为Foo
的对象的不可变引用。由于引用总是不可变的,因此只删除const部分(根据规范的第8.3.2段)!也就是说,你的函数返回Foo&
而不是const Foo&
,这就是编译器试图告诉你的。