gpt4 book ai didi

c++ - 在 C++ 中隐藏 int 变量的名称

转载 作者:可可西里 更新时间:2023-11-01 18:09:22 26 4
gpt4 key购买 nike

出于好奇,我试过这段代码,它来自一个面试问题[*]

int main(int argc, char *argv[])
{
int a = 1234;
printf("Outer: %d\n", a);
{
int a(a);
printf("Inner: %d\n", a);
}
}

在 Linux(g++ 4.6.3 和 clang++ 3.0)上编译时输出:

Outer: 1234
Inner: -1217375632

但是在 Windows (VS2010) 上它打印:

Outer: 1234
Inner: 1234

基本原理是,在第二个“a”变量的复制构造函数完成之前,第一个“a”变量仍然可以访问。但是我不确定这是标准行为,还是只是微软的(另一个)怪癖。

有什么想法吗?

[*] 实际问题是:

How you'd initialise a variable within a scope with the value of an identically named variable in the containing scope without using a temporary or global variable?

{
// Not at global scope here
int a = 1234;
{
int a;
// how do you set this a to the value of the containing scope a ?
}
}

最佳答案

How you'd initialise a variable within a scope with the value of an identically named variable in the containing scope without using a temporary or global variable?

除非可以显式命名外部范围,否则您不能这样做。您可以显式命名全局作用域、命名空间作用域和类作用域,但不能显式命名函数或 block 语句作用域。


C++11 [basic.scope.pdecl 3.3.2 p1 状态:

The point of declaration for a name is immediately after its complete declarator (Clause 8) and before its initializer (if any), except as noted below. [ Example:

int x = 12;
{ int x = x; }

Here the second x is initialized with its own (indeterminate) value. —end example ]

MSVC 正确地实现了这个例子,但是当初始化器使用括号而不是赋值语法时它没有正确地实现这个。有 a bug在 Microsoft Connect 上提交了有关此内容的信息。

这是一个示例程序,由于此错误,VS 中的行为不正确。

#include <iostream>

int foo(char) { return 0; }
int foo(int) { return 1; }

int main()
{
char x = 'a';
{
int x = foo(static_cast<decltype(x)>(0));
std::cout << "'=' initialization has correct behavior? " << (x?"Yes":"No") << ".\n";
}
{
int x(foo(static_cast<decltype(x)>(0)));
std::cout << "'()' initialization has correct behavior? " << (x?"Yes":"No") << ".\n";
}
}

C++ 包含以下注释。

[ Note: Operations involving indeterminate values may cause undefined behavior. —end note ]

但是,此注释表明操作可能导致未定义的行为,而不是它们必然。上面链接的错误报告包括来自 Microsoft 的确认,即这是一个错误,而不是程序触发未定义的行为。

编辑:现在我已经更改了示例,以便具有不确定值的对象仅在未评估的上下文中“使用”,我相信这绝对排除了未定义行为的可能性在任何平台上,同时仍然在 Visual Studio 中演示错误。

关于c++ - 在 C++ 中隐藏 int 变量的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10723892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com