c++ - 类模板中名称解析的实际结果与c++ 03标准不同

标签 c++ xcode standards token-name-resolution

我在 Xcode 4.1 和 Visual Studio 2008 上测试了 c++ 标准 ISO/IEC 14882-03 14.6.1/9 中的代码。两个编译器的输出都与标准的预期结果不同。

代码粘贴在下面。

#include <stdio.h>
#include <iostream>
using namespace std;

void f(char);

template <class T > void g(T t)
{
    f(1);
    f(T(1));
    f(t);
}

void f(int);
void h()
{
    g(2);
    g('a');
}

void f(int)
{
     cout << "f int" << endl;
}


void f(char)
{
    cout << "f char" << endl;
}


int main() { 
    h();  
    return 0;
}

作为标准的描述。预期的输出应该是

f char
f int
f int
f char
f char
f char

在 Xcode 4.1 上构建并运行代码。输出如下。在build设置中,我尝试将“Compiler for C/C++/Object-C”更改为 Apple LLVM Compiler 2.1、Gcc 4.2 和 LLVM GCC 4.2。输出是一样的。

f char
f char
f char
f char
f char
f char

在 Microsoft Visual Studio 2008 上构建并运行代码。输出如下。

f int
f int
f int
f int
f char
f char

标准的说明(14.6.1/9)贴在下面。

如果名称不依赖于模板参数(如 14.6.2 中所定义),则该名称的声明(或声明集)应在该名称出现在模板中的点的范围内定义;该名称绑定(bind)到在该点找到的声明(或多个声明),并且此绑定(bind)不受在实例化点可见的声明的影响。 [示例:

void f(char);
template<class T> void g(T t)
{
f(1); // f(char) 
f(T(1)); // dependent 
f(t); // dependent 
dd++; // not dependent
}
void f(int);
double dd;
void h()
{
// error: declaration for dd not found
g(2); // will cause one call of f(char) followed // by two calls of f(int)
g(’a’); // will cause three calls of f(char) 

——结束示例]

代码对编译器来说格式正确,但输出不同。把这段代码移植到不同的平台上会很危险。

有人知道为什么这些编译器不遵循标准吗?

2011 年 10 月 11 日编辑

根据 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#197 ,标准中的例子是错误的。我在 Clang 和 Gcc 上测试了下面的代码。

#include <stdio.h>
#include <iostream>
using namespace std;

void f(char);

template <class T > void g(T t)
{
    f(1);
    f(T(1));
    f(t);
}

enum E{ e };

void f(E );
void h()
{
    g(e);
    g('a');
}

void f(E )
{
    cout << "f E" << endl;
}

void f(char)
{
    cout << "f char" << endl;
}

int main() { 
    h();  
    return 0;
}

按预期输出。

f char
f E
f E
f char
f char
f char

谢谢,

杰弗里

最佳答案

您遇到的事实是 Visual Studio 没有实现 two-phase lookup .它们只会在您实例化模板时查找实际名称。

而且微软在这一点上几乎已经决定他们对支持两阶段查找不感兴趣。

关于c++ - 类模板中名称解析的实际结果与c++ 03标准不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7630806/

相关文章:

xcode - ITMS-90683 : Missing Purpose String in Info. plist (NSCalendarsUsageDescription)

iphone - 比较两个 UITextField

ios - 为标识符 (CELLNAME) 注册的 nib 无效 - nib 必须恰好包含一个顶级对象,该对象必须是 UITableViewCell 实例

c++ - 当分配返回 0 时,带有空异常规范调用构造函数的 operator new

c++ - 如何修复 “No such file or directory”库错误?我正在使用Mingw-w64编译器和Netbeans IDE

c++ - 在 ubuntu 10.04 下安装最新的 1.44 boost 库

c - C89 标准中的哪一部分允许 "implicit int"规则?

types - Erlang 头文件 (.hrl) 中应该和不应该有什么?

c++ - SDL bmp图像背景

C++ 处理特定的 impl - #ifdef vs 私有(private)继承 vs 标签调度