鉴于这两个功能:

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/

10-11 20:45