1

我正在追踪一个我无法弄清楚的 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 = &in;
    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 因为实际代码需要它。

4

3 回答 3

3

应用于const引用类型什么都不做。您需要制作模板参数const foo &,或者删除引用,然后在函数签名本身中添加两者const 和引用。

另请参阅何时应该使用 remove_reference 和 add_reference?特别是第二段。

于 2012-05-22T13:57:33.363 回答
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 = &in;
    return *inPtr;
}

修复此问题并编译代码。

于 2012-05-22T13:57:44.100 回答
0

从您的函数返回const T不会达到您的预期。从您的代码中,我了解到您希望它返回const Foo&,这是对类型不可变对象的引用Foo

但是当T是时Foo&,表达式const T意味着对类型对象的不可变引用Foo。由于引用始终是不可变的,因此 const 部分只是被删除(根据规范的第 8.3.2 段)!也就是说,你的函数返回Foo&而不是返回,const Foo&这就是编译器试图告诉你的。

于 2012-05-22T14:51:42.783 回答