gpt4 book ai didi

c++ - decltype 的另一个问题

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

//THIS IS JUST A FRAGMENT OF A static_numeric_limits.h for the purpose of this example   
#include <limits.h>

template<class T>
struct static_numeric_limits;

template<>
struct static_numeric_limits<signed char>
{/*min was outside of range for enum*/
static const signed char min = SCHAR_MIN,
max = SCHAR_MAX;
};

/*This "surplus" template is here for the reason that char is threated differently from signed char */
template<>
struct static_numeric_limits<char>
{/*min was outside of range for enum*/
static const char min = SCHAR_MIN,
max = SCHAR_MAX;
};

template<>
struct static_numeric_limits<unsigned char>
{
static const unsigned char min = 0x0,
max = UCHAR_MAX;
};
///REAL PROBLEM STARTS FROM HERE
template<class IntType,IntType low_range = static_numeric_limits<IntType>::min>
struct Int
{
Int():value_(IntType())
{}
Int(const IntType& pattern)
{
value_ = (pattern);
}
constexpr inline IntType getValue()const
{
return value_;
}
private:
IntType value_;
};

template<class IntType,class IntType_1>
auto operator+
(Int<IntType>& lhs, Int<IntType_1>& rhs)
-> Int<decltype(lhs.getValue() + rhs.getValue())>//HERE IS THE PROBLEM
{
return lhs.getValue() + rhs.getValue();
}

错误(来自 VS2010) error C2027: use of undefined type 'static_numeric_limits<T>'
错误(来自 gcc 4.6)
error: 'decltype ((lhs->getValue() + rhs->getValue()))' is not a valid type for a template constant parameter

为什么这不像我想象的那样有效?

最佳答案

这里的错误是什么类型decltype是从你的表达中推导出来的;不幸的是,错误消息并不清楚,这实际上是一个棘手的问题。

考虑表达式 0 + 0 的类型.这是一个int ,是的,但更重要的是它是一个右值(非正式地,它是一个临时值)。这意味着 decltype(0 + 0)不是 int ,但是int&& .现在考虑您的代码在这方面没有任何不同:您仍然有一个右值。

问题是模板非类型参数不能是右值引用,所以你不能有 Int<int&&> ,因为第二个参数的类型。你可以做的是:

#include <type_traits>

// ...

template <class IntType, class IntType_1>
auto operator+(const Int<IntType>& lhs, // be const-correct!
const Int<IntType_1>& rhs)
-> Int<typename std::remove_reference<
decltype(lhs.getValue() + rhs.getValue())>::type>
{
return lhs.getValue() + rhs.getValue();
}

这会取消引用 int&& ,给你裸int类型。希望 gcc 的错误消息更有意义:它试图告诉您不能使用 int&&对于您的非类型参数。


另一个问题(虽然可能不是问题)是整数运算会经历所谓的 usual arithmetic conversions .所以将两个 Int<char> 的值相加的结果的实际上将是一个 int ,所以你的返回类型应该是 Int<int> (并且是,使用固定代码)。

那么,问题是您还没有定义 static_numeric_limits<int> .但就像我说的,我怀疑这不是问题,你确实定义了它,只是没有显示在你的问题中。

关于c++ - decltype 的另一个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5874786/

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