我正在学习c++0x
,至少是Visual C ++ Express 2010 Beta支持的部分。
这是一个关于风格的问题,而不是它的工作原理。对于尚未发布的标准来说,对于风格和良好实践而言,现在还为时尚早......
在c++0x
中,您可以使用 - >定义方法的返回类型键入函数的末尾,而不是将类型放在开头。我认为由于lambdas和新decltype
关键字的一些用例需要对语法进行此更改,但据我所知,您可以在任何地方使用它。
// Old style
int add1(int a, int b)
{
return a + b;
}
// New style return type
auto add2(int a, int b) -> int
{
return a + b;
}
我的问题确实是,有些函数需要以新的方式定义它是否被认为是以这种方式定义所有函数以保持一致性的好方式?或者我应该坚持只在必要时使用它?
答案 0 :(得分:18)
为了保持一致,不要风格一致。代码应该是可读的,即可理解的,这是唯一真正的衡量标准。为95%的方法添加杂乱与其他5%一致,嗯,这对我来说听起来不对。
答案 1 :(得分:5)
有一个巨大的代码库使用'旧'/当前规则。我敢打赌,这将是很长一段时间。一致性问题有两个方面:您要与谁保持一致,需要新语法或所有现有代码的少数代码?
当一段时间不需要新语法时,我将继续使用旧语法,但是再一次,只有时间会告诉我们常用的用法。
另请注意,新语法仍然有点奇怪:您将返回类型声明为auto
,然后在签名声明结束时定义auto
的含义...它感觉不到自然的(即使你不把它与自己的经验相比较)
答案 2 :(得分:5)
就个人而言,我会在必要时使用它。就像this->
只在访问基类模板的成员时(或者当它们被隐藏时)才是必需的,所以auto fn() -> type
仅在返回类型无法在其余部分之前确定时才需要。功能签名是可见的。
使用这个经验法则可能会帮助大多数代码读者,他们可能会认为“为什么作者认为我们需要以这种方式编写声明?”否则。
答案 3 :(得分:5)
我认为没有必要将它用于常规功能。它具有特殊用途,可以让您轻松完成之前可能非常尴尬的事情。例如:
template <class Container, class T>
auto find(Container& c, const T& t) -> decltype(c.begin());
这里我们不知道Container是否为const,因此返回类型是Container::iterator
还是Container::const_iterator
(可以从begin()
返回的内容确定。)< / p>
答案 4 :(得分:2)
对我而言似乎会改变许多C ++(以及其他C类)程序员一生的习惯。
如果你为每一个功能使用了这种风格,那么你可能是唯一一个这样做的人: - )
答案 5 :(得分:2)
我将猜测当前的标准将会胜出,因为到目前为止,每个其他提议的更改都会定义。它已被扩展,当然,但C ++的基本语义是如此细致,以至于我认为它们不值得改变。他们影响了许多语言和风格指南,这是荒谬的。
至于你的问题,我会尝试将代码分成模块,以明确你使用旧式和新式的方式。在两个混合的地方,我会尽可能地确定并描绘它。将它们组合在一起等等。
[个人意见]我发现浏览文件并观察风格来回变换或彻底改变是非常不利的。它只是让我想知道还有什么潜伏在那里[/个人观点]
答案 6 :(得分:1)
好的风格变化 - 如果你不相信我,看看98年的风格是什么,现在是什么 - 很难知道什么是好的风格和原因。恕我直言,目前与C ++ 0X相关的所有内容都是实验性的,资格好或坏的风格还不适用。