c++ - 返回对象的 const 拷贝时发出警告

标签 c++ gcc clang compiler-warnings

看看下面的函数声明:

int Foo();        // [1] Ok
const int &Foo(); // [2] Ok
const int Foo();  // [3] Not Ok. Same as [1]. Compiler can warn.

Bar Foo();        // [4] Ok
const Bar &Foo(); // [5] Ok
const Bar Foo();  // [6] Ok, not same as [4] or [5], but more likely a typo then intended design.

是否可以要求 Clang 和/或 GCC 对 [6] 发出警告?

我知道这是合法的,但我认为它不是很有用。我很确定我们代码库中的所有此类声明都是拼写错误,我想在编译时检测到这些错误。

更新: 似乎对 [6] 中的 const 拷贝有些混淆。这是保护程度有多么低的示例。依赖调用代码不做拷贝是一个很大的设计缺陷。它一点也不健壮。我的问题仍然存在,我怎样才能得到关于这个的警告,而不是当我收到警告时我应该做什么。也许我会忽略它:)

Live demo

最佳答案

这对许多类型的对象都有意义,并且当模板类型扩展为 const 时会突然出现。对于类对象,comst 和非 const 对象之间的区别可能远非微不足道!考虑返回 const 和非 const 拷贝之间的区别,例如,包含全局数据的 getter 和 setter 的对象。如果const,则只能获取。如果不是……

请记住,这是为了防止搬起石头砸自己的脚,而不是为了防止故意规避类型系统。也可以写入 const 引用,但您明确地不认为这是一种打字错误。

关于c++ - 返回对象的 const 拷贝时发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32755035/

相关文章:

linux: ranlib 似乎没有将任何新信息添加到存档文件中?

c - gcc内部使用相同的位表示int和char吗?

c - AddressSanitizer,这些术语是什么意思?

c++ - 如何遍历clang AST的所有节点?

MAC OS X 10.8 上的 gcc 4.8 抛出 "Undefined symbols for architecture x86_64: "

c++ - 三元运算符可以抛出异常吗?

c# - C++ 到 .NET : I need help with understanding C++ code to convert it to . NET

c++ - 用于 C++11 支持的错误编译器版本存储库

c++ - 对命令行中指定的某些文件运行 ClangTool

c++ - 获取 [枚举成员?] 的封闭类型