gpt4 book ai didi

c++ - `decltype` : function return type `T` converted to `T&` for user-defined types (VS2010)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:37 24 4
gpt4 key购买 nike

编辑:GCC 编译得很好,这是 VS2010 的问题。感谢您将我指向 ideone.com!

尝试编译以下内容时(VS2010):

#include <iostream>

template< typename PF01, typename PF02 >
inline auto FCall01( PF01 fCallee, PF02 && fParameter00 ) -> decltype( fCallee( std::forward< PF02 > ( fParameter00 ) ) )
{
decltype( fCallee( std::forward< PF02 > ( fParameter00 ) ) ) lResult( fCallee( std::forward< PF02 >( fParameter00 ) ) ); // offending line for Foo03

return ( lResult );
}

int gI = 0;
int & gCI = gI;

struct TA
{
int mData;
TA( int fData = 0 ) : mData( fData ) { }
TA( TA const & fA ) : mData( fA.mData ) { }
};

int Foo00( int & fA ){ return ( fA ); }
int & Foo01( int & ){ return ( gCI ); }
int const & Foo02( int & ){ return ( gCI ); }
TA Foo03( int & fA ){ return ( TA( fA ) ); }

int main( void )
{
decltype( FCall01( Foo00, gI ) ) l0( FCall01( Foo00, gI ) );
l0 = -1;
std::cout << gI << " : " << l0 << std::endl;

decltype( FCall01( Foo01, gI ) ) l1( FCall01( Foo01, gI ) );
l1 = -2;
std::cout << gI << " : " << l1 << std::endl;

decltype( FCall01( Foo02, gI ) ) l2( FCall01( Foo02, gI ) );
const_cast< int & > ( l2 ) = -3;
std::cout << gI << " : " << l2 << std::endl;

decltype( FCall01( Foo03, gI ) ) l3( FCall01( Foo03, gI ) );
l3.mData = -4;
std::cout << gI << " : " << l3.mData << std::endl;

return ( 0 );
}

我收到编译器警告:

Warning C4239: nonstandard extension used : 'initializing' : conversion from 'TA' to
'TA &'; A non-const reference may only be bound to an lvalue; see reference to function
template instantiation 'TA &FCall01<TA(__cdecl *)(int &),int&>(PF01,PF02) with
[PF01=TA(__cdecl *)(int &),PF02=int &]' being compiled.

对于内置类型,一切都很好,但是对于用户定义的类型,模板函数 FCall 中的 decltype(...) 给了我 TA& 而不是 TA,同时作为 FCall 返回类型和 FCall 中的局部变量。

我没有看到它背后的逻辑,我认为标准说 decltype(f()) 应该给出 f() 的准确返回类型。它适用于内置类型。用户定义类型是否有一些隐藏的陷阱,或者它只是 VS2010 在耍我?

附言我无法访问 GCC,有人可以检查 GCC 编译是否没有警告吗?

最佳答案

这是 VS2010 中的编译器错误。 GCC (ideone.com) 和 Visual C++ 11 Developer Preview 都不会发生这种情况。

感谢 PlasmaHH 和 Xeo 提供指向 ideone.com 的链接,以及 Jesse,了解有关 Visual C++ 11 开发人员预览版中错误状态的信息。

编辑:只是跟进:VS2010 中的这个错误发生在用户定义类型具有用户定义构造函数时。如果没有(使用编译器生成的默认值),则不会发生错误。

关于c++ - `decltype` : function return type `T` converted to `T&` for user-defined types (VS2010),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8758950/

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