gpt4 book ai didi

c++ - 为什么 Visual Studio 不在 self 赋值时发出警告 (int foo = foo;)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:23:21 29 4
gpt4 key购买 nike

我在重构一个出现了无数次的术语时不小心产生了如下代码中的情况:

#include "stdafx.h"
#include <iostream>

int foo = foo;

//By replacing with the following instruction we causes a compile error
//int foo(foo);

int _tmain(int argc, _TCHAR* argv[])
{
int bar = bar;
std::cout << "Well this is awkward " << foo << std::endl;
return 0;
}

对于不同的调试和发布配置,编译器对 int foo = foo; 保持沉默。

我看不出这种说法不是等待发生的错误。 Visual Studio 编译器不应该发出警告吗?

我并不是假装这是未定义的行为。我的意思是,默认情况下从变量对其自身进行赋值很可能是程序员的错误。除非有人对赋值运算符的使用有一个奇怪的方案。

最佳答案

一个类似的问题(i=i++)确实是未定义的行为,但这主要是因为该指令包含对同一变量的两次赋值:

  • 自增i ( i++ ),这是在指令 i++ 之后的某个时间完成的返回 i

  • i的赋值

问题是我们无法真正知道i 的赋值是否正确。发生在递增之前或之后,因此是未定义的行为。

在您的示例中,foo=foo ,我们有一个读取,然后是一个写入。毫无疑问,我们必须在写入之前读取该值,因此很容易定义。

旁注是如果 operator=被重新定义,那么 foo=foo可以做很多事情,而不仅仅是将 foo 复制到自身。 C++ 有目的地允许您以多种不同的方式在食物中射击自己。但无论如何,C++ 编译器都不是警告/错误主动性的黄金标准。

关于c++ - 为什么 Visual Studio 不在 self 赋值时发出警告 (int foo = foo;),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20116684/

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