2016-03-01 67 views
1

我被告知这个功能有问题,但是在做了研究并尝试自己使用它之后,我似乎无法找到它的问题。有人只是想惹我吗?这个功能的问题

std::string foo() throw() 
{ 
    std::string s("hello world"); 
    return s; 
} 
+0

什么是你跟错了...?有返回值优化和复制elision的可能性,但这就是我所看到的。 – callyalater

+0

@callyalater这个和'throw'被许多人认为是不好的做法,但除此之外这是完全没有问题的, –

+0

除了'throw()'被弃用,我什么都看不到。 –

回答

7

根据您的编译器设置,std::string可以从它的构造,如果后盾内存字符串内容的分配失败时抛出。这会违反你放置的throw()条款。

否则,代码是好的,但当然也可以缩短:

std::string foo() 
{ 
    return "hello world"; 
} 
+0

这就是我的想法,但我的教授一直暗示它有什么问题。谢谢 –

+0

如果有的话,你会希望函数指示它正在返回一个'const'值,用这个方法,因为试图修改这个''hello world''不会很好玩。 – TezlaCoil

+1

@user:但它没有返回一个const对象。 'std :: string'创建一个新的可完全修改的字符串,其中包含常量字符串的副本。每个'std :: string'完全包含它所拥有的堆的缓冲区中的内容;没有'std :: string'引用任何其他人拥有的内存,包括其他'std :: string's(至少,它不允许出现这样做 - 一些STL实现有写时复制'std :: string',但它等于相同的东西)。 – Cameron