gpt4 book ai didi

c++ - 为什么要编译(在初始化之前在函数中使用)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:10 25 4
gpt4 key购买 nike

考虑这段代码(使用 CString 因为它很熟悉并且在未构造时很容易看到,但类没有什么特别之处),在 Visual Studio 2008 下测试:

CString DoSomething( const CString& sString )
{
return sString;
}

CString sTest1 = DoSomething( sTest1 ); // Compiles (no warnings), fails at runtime
CString sTest2( DoSomething( sTest2 ) ); // Doesn't compile
CString sTest3; sTest3 = DoSomething( sTest3 ); // Compiles, self-assignment, works

据我了解 C++ 标准,Test1 可以作为编译时优化自动编译到 Test2 中,前提是提供了适当的构造函数(默认情况下,将生成与第一个测试相同的构造函数)。但是,值得注意的是,该行为与 Test3 不同,后者可以正常工作。

现在明白为什么Test1不行,为什么Test2不能编译了。我很好奇的是为什么 Test1 首先编译?这在标准中是否允许,开放解释,VS2008 编译器中的缺陷,使用前初始化静态检查的缺陷,或者什么?在这种情况下,有什么方法可以强制编译器至少发出警告(Test1 似乎在 VS2008 下以最大警告级别编译干净)? C++ 规范允许这种构造的理由是什么?

编辑:或者,有什么方法可以强制编译器将 Test1 编译为 Test2(从而触发错误)?

编辑以添加 Test2 的逐字错误消息:错误 C2065:“sTest2”:未声明的标识符

最佳答案

您在 sTest1 中看到的行为在 C++ 标准中未定义。这很奇怪而且是错误的,但它可以在一些编译器上编译。

有关更多详细信息,请参阅以下线程中 litb 的回答:method running on an object BEFORE the object has been initialised?

关于c++ - 为什么要编译(在初始化之前在函数中使用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/731908/

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