让我们考虑以下代码:
int main() {
int i = 2;
int b = ++i++;
return 3;
}
Run Code Online (Sandbox Code Playgroud)
编译时出现以下错误:
<source>: In function 'int main()':
<source>:3:16: error: lvalue required as increment operand
3 | int b = ++i++;
| ^~
Run Code Online (Sandbox Code Playgroud)
这对我来说听起来很公平。后缀增量的优先级高于前缀增量的优先级,因此代码被解析为int b = ++(i++);,i是右值。因此,错误。
现在让我们考虑带有括号的此变体,以覆盖默认优先级:
int main() {
int i = 2;
int b = (++i)++;
return 3;
}
Run Code Online (Sandbox Code Playgroud)
该代码将编译并返回3。对我来说,这听起来很公平,但似乎与第一个代码矛盾。
问题:为什么(++i)是lvalue当i不成?
谢谢!
更新:上面显示的错误消息来自gcc(x86-64 9.2)。这是确切的渲染: gcc错误
Clang x86-64 9.0.0有一个完全不同的消息: clang错误
<source>:3:13: error: expression is …Run Code Online (Sandbox Code Playgroud) 我正在尝试将地址清理程序与 MSVC 一起使用。
Visual Studio 安装程序显示我有“Visual Studio Community 2019”版本 16.9.0。
我有最基本的C++程序:
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
CMakeLists.txt 也非常基本:
cmake_minimum_required(VERSION 3.14)
project(untitled VERSION 1.0.0)
add_executable(${PROJECT_NAME} main.cpp)
add_definitions(/fsanitize=address /Zi)
Run Code Online (Sandbox Code Playgroud)
程序在调试和发布模式下都能正确编译和链接。在发布模式下,我收到以下警告,这似乎完全合法:
LINK:警告 LNK4302:请将“/DEBUG”添加到链接命令行以获得更好的 ASAN 错误报告
到目前为止,一切都很好 (?)。
但是,当我运行该应用程序时,返回代码为-1073741515 (0xC0000135)。谷歌告诉我这可能表明缺少一个库。
如果我add_definitions(/fsanitize=address /Zi)从构建中删除,返回值为 0。丢失的库很可能是地址清理程序本身。
如何正确配置我的系统来解决此问题?谢谢!
让我们考虑以下代码:
#include <type_traits>
int foo(int arg) {
if (std::is_constant_evaluated()) {
return 1;
} else {
return 0;
}
}
int main() {
const auto b = foo(0);
return b;
}
Run Code Online (Sandbox Code Playgroud)
它用gcc 和 clang返回 0 。我原以为它会返回 1 。
如果foo()是 made constexpr, whileb被简单地保留const,那么它确实返回 1 。
我在这里缺少什么?谢谢!