Closed. This question is opinion-based。它当前不接受答案。












想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。

6年前关闭。



Improve this question




我是编程入门类(class)中的助教,我们在那里教C++ 11。特别是,我的部分是关于内存管理的基础知识(值与引用语义,存储持续时间,自动与动态对象等)。

可以预见的是,学生们发现这部分内容还是相当不错的(对于绝大多数人来说,这是他们第一次听说这种东西)。他们必须面对的主要问题之一是学习如何区分与号的不同含义(定义左值引用与获取左值的地址)。为此,由于我们正在使用C++ 11,所以我想知道呈现std::addressof函数是否有意义。

这可以帮助消除任何歧义。以下代码段:
int b = 10;
int* a = &b;
int& c = b;

可能成为:
int* a = std::addressof(b);
int& c = b;

&将恰好具有一种含义:定义左值引用。从一方面来看,这似乎是合理的,因为:
  • 的重点不是培训C++程序员(更多高级类(class)转向Java),而
  • 我仍然可以连同std::addressof一起提供address-of运算符。

  • 我看到的缺点是在教一些不习惯的东西。考虑到列表中的第一个项目符号,这可能很好。但是,我主要担心技术的缺点,这些缺点目前无法预见(例如运行时成本)。

    最佳答案

    忘记运行时间成本。您应该专注于教授正确的方法。如果您要做的只是获取一个简单变量的地址,那么使用addressof并不是惯用的。惯用语类似于int* a = &b;您的学生需要了解&在不同情况下的含义。

    我赞赏您的“重点不是培训C++程序员”,但是请您考虑长期的问题。我认为在您的学校中,大多数最终将成为现实世界中的C++程序员并最终为像我这样的人工作的学生将在一开始就遍历您的类。我无法告诉您,我不得不竭尽全力来重新培训应届毕业生,因为他们在学校学到的东西简直是错误的。您现在教他们的坏习惯往往会比您可能意识到的要持久得多。即使您完全期望这些学生在更高级的类(class)中接受再培训,他们也通常会保留其早期类(class)。请不要现在教他们一些东西,我以后只需要教他们。

    首次学习指针是 hard 。毫无疑问。大多数人为此感到挣扎。我对您的建议不是尝试通过addressof或其他巧妙的技巧使其变得更容易,而是要耐心且始终如一。

    10-01 20:06