Walton1128/CPP-Templates-2nd--

pdf 第27页中的拼写错误

Opened this issue · 2 comments

会遇到 run-time error, 这是因为对 C 字符串,max(max(a, b), c)会创建一个用于返回的临时局
部变量,而在返回语句接受后,这个临时变量会被销毁,导致 man()使用了一个悬空的引用。
不幸的是,这个错误几乎在所有情况下都不太容易被发现。

上文中max被拼写成了man

Zard-C commented

会遇到 run-time error, 这是因为对 C 字符串,max(max(a, b), c)会创建一个用于返回的临时局 部变量,而在返回语句接受后,这个临时变量会被销毁,导致 man()使用了一个悬空的引用。 不幸的是,这个错误几乎在所有情况下都不太容易被发现。

上文中max被拼写成了man

除了拼写错误之外,现代编译器已经能发现试图返回局部变量的引用这种情况,以上面提到的代码为例:
os: ubuntu x86
compiler: g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
IDE: vscode

test_max.cpp: In instantiation of ‘const T& test::max(const T&, const T&, const T&) [with T = const char*]’:
test_max.cpp:38:34:   required from here
test_max.cpp:20:15: warning: returning reference to temporary [-Wreturn-local-addr]
   20 |     return max(max(a, b), c);
      |            ~~~^~~~~~~~~~~~~~

并且vscode 的 c++ 插件也会以warning的方式提醒。

警告⚠️信息很重要,我们不应该忽视。

会遇到 run-time error, 这是因为对 C 字符串,max(max(a, b), c)会创建一个用于返回的临时局 部变量,而在返回语句接受后,这个临时变量会被销毁,导致 man()使用了一个悬空的引用。
对应原文
becomes a run-time error because for C-strings, max(a,b) creates a new, temporary local value that is returned by reference, but that temporary value expires as soon as the return statement is complete, leaving main() with a dangling reference.

原文意思是max(a, b)调用了传值版本导致创建了临时变量,译文用的是max(max(a, b), c)?

godbolt代码演示
根据各个编译器的汇编可以发现,因为max(max(a, b), c) 实际上调用了两次传值版本的max导致最后返回临时变量的引用。