0
template<class IntT, IntT low = IntT(), IntT high = IntT()>
struct X 
{
    static_assert(std::is_same<decltype(low),decltype(high)>::value,"Different types not allowed");//this should give error if types are different
    decltype(low) a;
    decltype(high) b;
    X():a(decltype(a)()),b(decltype(b)())//WHY THIS DOES NOT COMPILE?
    {
        cout << typeid(a).name() << '\n';
        cout << typeid(b).name() << '\n';
    }
};

int _tmain(int argc, _TCHAR* argv[])
{


    X<char,1,'a'> x;//this according to static_assert shouldn't compile but it does

    return 0;
}

使用VS2010。
请参阅上面代码中的 3 条注释。

4

3 回答 3

4

首先要注意的是,VS2010 已经过时并且在它发布的那天就被破坏了。decltype 关键字特别成问题,仅适用于最基本的用途。事实上,它在很多基本的事情上都错了。

接下来是代码...

template<class IntT, IntT low = IntT(), IntT high = IntT()>
struct X 
{
    static_assert(std::is_same<decltype(low),decltype(high)>::value,"Different types not allowed");//this should give error if types are different

但他们永远不会。

    decltype(low) a;
    decltype(high) b;

你不需要 decltype 这里。类型为 IntT。

    X():a(decltype(a)()),b(decltype(b)())//WHY THIS DOES NOT COMPILE?

因为 VS2010 已损坏,并且通常不允许您像使用类型一样使用 decltype 表达式。事先使用 typedef 可能会更好。

幸运的是,您不需要它,因为您可以只使用默认构造函数而不是副本。

int _tmain(int argc, _TCHAR* argv[])
{


    X<char,1,'a'> x;//this according to static_assert shouldn't compile but it does

否。 static_assert 检查类型是否相同。它们的char都是1 和 'a'。

    return 0;
}

您似乎正在尝试创建一个模板,以便第二个和第三个参数的类型基于您传递给它的值的任何解析类型。这是做不到的。

于 2011-02-22T07:38:42.910 回答
3

static_assert 确实可以编译,因为模板参数 low 和 high 的 decltype 是 char。查看您的模板定义和实例化。IntT <-- 字符

要默认初始化您的成员,您可以这样写:

X():a(),b()
{
于 2011-02-22T07:27:12.470 回答
1
X():a(decltype(a)()),b(decltype(b)())//WHY THIS DOES NOT COMPILE?

GCC 编译得很好。看到这个:http ://www.ideone.com/DG7rt

看起来像是 MSVC++10 编译器错误!

于 2011-02-22T07:23:05.700 回答