Visual Studio中嵌套模板函数的typeid不一致

时间:2015-02-17 01:19:38

标签: c++ visual-studio templates visual-c++

在使用Visual Studio 2013社区进行编译时,我在2013年11月的CTP中偶然发现了一个奇怪的行为。以下程序编译并打印“true”,而预期的行为是打印“false”,这是GCC and clang所做的。

我已经在我的设置以及以下网站上测试了此代码:http://webcompiler.cloudapp.net/(声明VS编译器版本19,也打印“true”),http://codepad.org/http://www.tutorialspoint.com/compile_cpp_online.php还有其他一些。

我不确定这里的正确行为是什么,或者下面的代码是否真的是正确的C ++代码,所以我很难过。如果有人能够对这里发生的事情有所了解,那就太棒了。

#include <stdio.h>
#include <typeinfo>

template <typename T>
struct foo
{
    template <typename U>
    static void bar() {}
};

template <typename T>
void baz() {
    puts(typeid(&foo<T>::template bar<int>) == typeid(int) ? "true" : "false");
}

int main() {
    baz<double>();
}

修改

感谢Reddit,我设法将此错误提请STL注意,STL已经报告了它并将在VS 2015 RTM中修复:http://www.reddit.com/r/cpp/comments/2zs2ob/vc_2015_rtm_what_do_you_want_it_to_have/cpm01wr

1 个答案:

答案 0 :(得分:5)

VS2013(使用VS2013.4测试)确实错误地将成员函数模板的类型(static或不是{)设置为int。考虑下面的简化示例,其中很明显代码是正确的C ++:

#include <typeinfo>
#include <iostream>

struct foo
{
    template<typename T>
    static void bar()
    { }
};

int main() {
    std::cout << typeid(&foo::bar<int>).name() << "\n";
    std::cout << typeid(int).name() << "\n";
    std::cout << (typeid(&foo::bar<int>) == typeid(int) ? "true\n" : "false\n");
}

将打印

int
int
true

而不是删除bar的模板参数时发生的情况:

void (__cdecl*)(void)
int
false