将`std :: addressof`和`operator&`一起引入学生会不会有任何缺点?

Ili*_*llo 1 c++ c++11

我是编程入门课程的助教,我们教C++ 11.特别是,我的部分是关于内存管理的基础知识(值与参考语义,存储持续时间,自动与动态对象等).

可以预见的是,学生们发现这部分非常相似(对于绝大多数人来说,这是他们第一次听到这些内容).他们必须面对的主要问题之一是学习如何区分&符号的不同含义(定义左值引用与获取左值的地址).为此,由于我们使用的是C++ 11,我想知道是否有意义来呈现该std::addressof功能.

这可以帮助消除任何歧义.以下片段:

int b = 10;
int* a = &b;
int& c = b;
Run Code Online (Sandbox Code Playgroud)

可能成为:

int* a = std::addressof(b);
int& c = b;
Run Code Online (Sandbox Code Playgroud)

并且&它将恰好与一个含义相关联:定义左值引用.从一方面来看似乎是合理的,因为:

  • 重点不在于培训C++程序员(更高级的课程切换到Java),以及
  • 我仍然可以提供运算符的地址std::addressof.

我看到的缺点是教一些不是惯用的东西.鉴于列表中的第一颗子弹,这可能没问题.然而,我最担心的是我目前无法预见的技术缺点(例如,运行时成本).

Joh*_*ing 10

忘掉运行时的成本.你应该专注于教授正确的方法.addressof如果你所做的只是获取一个简单变量的地址,那么使用并不是惯用的.什么惯用语就像int* a = &b; 你的学生需要理解&在不同背景下的意义.

我很欣赏你的"重点不在于培训C++程序员",但我恳请你考虑长期考虑.在你的学校里,我想大多数最终将成为现实世界中C++程序员并最终为像我这样的人工作的学生将在一开始就通过你的班级.我不能告诉你有多少次我不得不竭尽全力重新培训最近的毕业生,因为他们在学校学到的东西都是错误的.你现在教给他们的坏习惯往往会比你意识到的更频繁地坚持下去.即使你完全期望这些学生能够在更高级的课程中接受再培训,他们也会经常保留他们的早期课程.请不要教他们现在我将不得不在以后取消教学.

第一次学习指针很难.毫无疑问.大多数人都在努力.我对你的建议不是试图通过绕过它addressof或其他聪明的技巧来使它变得更容易,而是要在你的教导中保持耐心和一致.