鉴于这两个功能:
template <typename T> void Print1( const T& aValue, const T& aDefaultValue )
{
if( aValue != aDefaultValue ) std::cout << aValue << std::endl;
}
template <typename T> void Print2( const T& aValue, const decltype(aValue)& aDefaultValue )
{
Print1<T>( aValue, aDefaultValue );
}
我看到几乎在gcc 9中,类型推导始终适用于
Print2
,但不适用于Print1
unsigned int i = 0;
Print1( i, 0 ); // dont work (cant do type deduction)
Print2( i, 0 ); // work
这是
decltype
技术与c++的一致性,为什么? 最佳答案
从template_argument_deduction,在非推论上下文中:
所以在
template <typename T> void Print2(const T& aValue, const decltype(aValue)& aDefaultValue)
aDefaultValue
的类型不可推论。T
仅从aValue
推论得出。在C++ 20中,替代方法是使用
std::type_identity
:template <typename T>
void Print2(const T& aValue, std::type_identity_t<const T&> aDefaultValue);
关于c++ - c++一致性是否使用decltype来帮助模板推导?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60409941/