如何确保参数作为常量引用传递?

How to make sure arguments are passed as const reference?

提问人:crommy 提问时间:6/22/2020 更新时间:6/22/2020 访问量:141

问:

我正在为一些正在学习 C++ 入门课程的学生测试一些代码。 我想测试他们的一些方法是否接受未更改为常量引用的参数,但除了编写一个可以解析其代码中文本的脚本之外,我真的想不出任何聪明的方法来检查这一点。

我想尝试将 Rvalue 传递给他们的方法,如果他们只接受引用,代码不会编译,但这并不能阻止他们仅通过值接收他们的参数。

谢谢!

C++ 常量 按引用传递

评论

4赞 463035818_is_not_an_ai 6/22/2020
如果你不能分辨出区别,为什么要把它作为一项要求?请不要无缘无故地对学生提出要求
1赞 Alan Birtles 6/22/2020
使值不可复制/可移动,则它们只能通过引用接受
2赞 JohnFilleau 6/22/2020
要求轮流的同学进行同行评审,其中评审标准之一是一致性正确性。抽查这些内容,以确保同行评审符合您的期望。由于该课程正在教授编码风格,因此教授同行评审之类的东西似乎也是一个自然的延伸。添加故障树分析,如果您感觉很笨拙 🐞🐿️
1赞 JohnFilleau 6/22/2020
那你处于什么位置?我知道你要求一件事,我建议了另一件事,这可能让你有同样的感受,当我们告诉他们应该使用而不是衰减的指针时,这里的大多数学生都有同样的感受。std::vector
1赞 JohnFilleau 6/22/2020
您能举几个例子来说明学生需要编写的函数/类类型吗?你是给他们一个接口,他们必须实现这些功能(而且只有那些),还是给他们自由来实现他们需要的东西?因为如果是后者,那么任何识别非常量引用或副本的自动化系统仍然需要人工审查以确定它是否有意义。有时,副本是正确的方法。

答:

1赞 Jarod42 6/22/2020 #1

测试学生类的驱动程序可能会检查很多东西:

  • 定期测试的行为。

  • 使用中间常量引用的常量:

    Matrix Test_Const_Add(const Matrix& lhs, const Matrix& rhs)
    {
        return lhs + rhs;
    }
    
  • 如果要测试的类是模板,则可以使用工具化(对调用的方法进行计数)或特定类(不可复制,不可默认构造等)

  • 通过内省的方法/函数签名:

    • 非重载/非模板化函数的函数特征。

    • 分配给成员/函数指针

      float (Matrix::*at)(std::size_t, std::size_t) const = &Matrix::at;
      float& (Matrix::*at)(std::size_t, std::size_t) = &Matrix::at;
      
    • 您也可以编写工具(例如使用 LibTooling)来检查特定内容。

    不过要注意 instrospect,因为可能有几种有效的方法来编写代码(例如重载或默认参数可能会“破坏”函数特征)。