[英]`decltype` as part of template type specification within declaration of a template function
以下代碼在MSVC ++中編譯,但在GCC 4.5.1中不編譯:
#include <iostream>
template< typename PT, bool pB >
struct TA
{
PT m;
TA( PT fT ) :
m( fT )
{
std::cout << "TA<" << pB << ">::TA() : " << m << std::endl;
}
PT operator()( PT fT )
{
std::cout << "TA<" << pB << ">::() : " << m << " and " << fT << std::endl;
return ( m );
}
};
template< typename PT >
PT Foo( PT fT )
{
std::cout << "Foo() : " << fT << std::endl;
return ( fT );
}
// Does not compile in GCC 4.5.1, compiles in MSVC++2010.
// Substitute TA< decltype( fF( std::forward<PP>( fP ) ) ), pB > with
// TA< double, pB > to compile with GCC.
template< bool pB, typename PF, typename PP >
auto Func( PF fF, PP && fP, TA< decltype( fF( std::forward<PP>( fP ) ) ), pB > && fA )
-> decltype( fF( std::forward<PP>( fP ) ) )
{
decltype( fF( std::forward<PP>( fP ) ) ) lResult( fF( std::forward< PP >( fP ) ) );
fA( lResult );
return ( lResult );
}
int main( void )
{
Func< true >( Foo< double >, -1.2, 2.1 );
return ( 0 );
}
注釋指向有問題的行並顯示了修復程序(從設計的角度來看,這實際上不是修復程序,只是編譯修復程序)。 幾個問題:
MSVC ++正確編譯嗎?
如果我們要更改參數的順序
auto Func( PF fF, PP && fP, TA< decltype( fF( std::forward<PP>( fP ) ) ), pB > && fA )
至
auto Func( PF fF, TA< decltype( fF( std::forward<PP>( fP ) ) ), pB > && fA, PP && fP )
它不會編譯,因為編譯器將fP
在TA< decltype( fF( std::forward<PP>( fP ) ) ), pB >
作為未聲明的變量。 從邏輯上講,編譯器此時真的需要知道fP
嗎,因為它具有尾隨return-type的功能,所以它是否仍不解析整個聲明? 為什么不能“跳過”第二個函數參數,看看以后是否在函數聲明中聲明了fP
? 還是我在這里遺漏了一些基本知識(也許是《標准》的某些段落)?
我相信MSVC是正確的。
您不能在較早的參數的聲明中引用較晚的參數,因為該名稱尚未在范圍內。 為了確定fA
參數的類型, fP
和fF
必須在范圍內,以便可以評估decltype
表達式。
如果您明確指定模板參數,則它可與gcc一起使用:
Func< true,decltype(&Foo<double>),double>( Foo< double >, -1.2, 2.1 );
直接將“ double”指定為TA
的參數這一事實和事實表明,對TA
參數使用從屬類型將阻止PF
和PP
的類型推導。 我不明白為什么會這樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.