在 C++ 中使用标准库函数名作为标识符是否有效?

Des*_*tor 2 c++ reserved-words identifier variable-names

考虑以下程序:

#include <cstdio>
int main()
{
    int printf=9;
    std::printf("%d",printf);
}
Run Code Online (Sandbox Code Playgroud)

在变量声明中使用内置函数名作为标识符可以吗?这是定义明确的程序吗?我的意思是上述程序的行为是否明确定义?我很想知道 C++ 标准是否允许使用标准函数名称作为变量的标识符

Lig*_*ica 5

它是格式良好的,因为两者都不std::printf::printf(也可能已由<cstdio>!)声明在与您的整数相同的范围内,因此在块的持续时间内自动优先。

[C++14: 3.3.1/1]: [..]要确定声明的范围,有时参考声明的潜在范围会很方便。声明的范围与其潜在范围相同,除非潜在范围包含另一个同名声明。在这种情况下,内部(包含)声明区域中声明的潜在范围被排除在外部(包含)声明区域中的声明范围之外。

例如,您通常无法在 namespace scope 执行此操作

它是明确定义的,因为标准库中的实体名称并不是固有的保留名称:

[C++14: 2.11/3]:此外,一些标识符保留供 C++ 实现和标准库 (17.6.4.3.2) 使用,不得用于其他用途;不需要诊断。

[C++14: 17.6.4.3.2/1]: 某些名称和函数签名集始终保留给实现:

  • 每个包含双下划线_ _或以下划线开头后跟大写字母 (2.12) 的名称都保留给实现以供任何使用。
  • 每个以下划线开头的名称都保留给实现以用作全局命名空间中的名称。