在使用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
答案 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