我一直在编写代码,最近发现 g++ 不会警告我某一类问题:根据 C++11 5.1.2.4,如果您的 lambda 不是单个返回语句,则返回类型必须声明为尾随返回类型或为 void。
尽管 g++ 允许编译无效代码(如果它足够有意义),但有没有办法关闭此行为(允许使用-fpedantic
在 g++-4.7 中)或至少警告它?
示例代码:
[]() { return 0; } //is fine
[&a]() { a++; return 0; } //is not fine but g++ doesn't warn me
[&a]() -> int {a++; return 0; } //is fine again
C++11 5.1.2.4
实现不得将右值引用类型的成员添加到闭包类型。
如果 lambda 表达式不包含 lambda 声明符,则就好像 lambda 声明符是 ()。如果 lambda 表达式不包含尾随返回类型,则尾随返回类型就好像表示以下类型:
— 如果复合语句的形式为
{ 属性说明符-seq(opt) 返回表达式 ; }
左值到右值转换 (4.1)、数组到指针转换 (4.2) 和函数到指针转换 (4.3) 后返回表达式的类型;
——否则无效。
这是因为它是标准中的缺陷,并且将被更改(参见DR 975):
第975章
似乎不存在任何技术困难
要求当前限制 lambda 的返回类型可以
仅当 lambda 主体由单个 return 组成时才能推论
陈述。特别是,多个 return 语句可以是
如果它们都返回相同的类型,则允许。
我怀疑是否有办法将其关闭。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)