簡體   English   中英

在模板函數的聲明中,`decltype`作為模板類型規范的一部分

[英]`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 ); 
}

注釋指向有問題的行並顯示了修復程序(從設計的角度來看,這實際上不是修復程序,只是編譯修復程序)。 幾個問題:

  1. MSVC ++正確編譯嗎?

  2. 如果我們要更改參數的順序

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 )

它不會編譯,因為編譯器將fPTA< decltype( fF( std::forward<PP>( fP ) ) ), pB >作為未聲明的變量。 從邏輯上講,編譯器此時真的需要知道fP嗎,因為它具有尾隨return-type的功能,所以它是否仍不解析整個聲明? 為什么不能“跳過”第二個函數參數,看看以后是否在函數聲明中聲明了fP 還是我在這里遺漏了一些基本知識(也許是《標准》的某些段落)?

  1. 我相信MSVC是正確的。

  2. 您不能在較早的參數的聲明中引用較晚的參數,因為該名稱尚未在范圍內。 為了確定fA參數的類型, fPfF必須在范圍內,以便可以評估decltype表達式。

如果您明確指定模板參數,則它可與gcc一起使用:

Func< true,decltype(&Foo<double>),double>( Foo< double >, -1.2, 2.1 );

直接將“ double”指定為TA的參數這一事實和事實表明,對TA參數使用從屬類型將阻止PFPP的類型推導。 我不明白為什么會這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM