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が必要なので、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

しかし、TisFoo&の場合、式は type のオブジェクトへの不変参照をconst T意味します。参照は常に不変であるため、const 部分は削除されます (仕様の段落 8.3.2 によると)。つまり、関数は戻りますが戻りません。それがコンパイラが伝えようとしていることです。FooFoo&const Foo&

于 2012-05-22T14:51:42.783 に答える