2014-10-06 69 views
4

在C++ 98/03/11中的下面的代碼是有效的:修改臨時文件不正確嗎?

std::string meow() { return "meow"; } 

int main() 
{ 
    meow().append("purr"); 
    return 0; 
} 

由於在分號臨時模具,這應該是安全的嗎?

+0

如果你想阻止這種行爲,你可以實際上返回一個'const std :: string'。 – pmr 2014-10-06 11:15:02

回答

4

這並不正確,在某些情況下這樣做很有用。

假設我有很多數據的載體,我要清除的數據和存儲..

{ 
    std::vector<int>().swap(myVec); 
} 

將清除內存一定的。 myVec.clear()可能只改變邏輯大小回0

正如我在以前的問題表明你可以使用它像這樣:

class Foo 
{ 
    public: 
     Foo& operator+=(Foo const&); // implement 
     Foo operator+(Foo const& rhs) const 
     { 
      return Foo(*this) += rhs; 
     } 
}; 

有執行修改臨時然後通過返回的值是(R C++ 11中的值參考,按C++ 03中的值)。

與R值引用

很明顯,你有更多的例子像你的情況,你可以返回meow().append("purr")

+0

我知道這只是一個例子,但如果有人不知道..在C++ 11中,你可以使用'shrink_to_fit' – 2014-10-06 11:13:00

+0

@NeilKirk'shrink_to_fit'不具有約束力。 – 2014-10-06 11:29:09

+0

不,但它暗示編譯器。我們相信編譯器會在需要時進行其他優化,爲什麼不這樣呢? – 2014-10-06 11:34:34

1

這是合法的,並且有用:

class Foo{ 
    int *data; 
public: 
    Foo(){data=new int[100];} 
    Foo(const Foo& other){ //copy ctor 
     if(other.data!=nullptr){ 
      data=new int[100]; //make a new array 
      for(unsigned i=0; i<100; ++i) // 
       data[i]=other.data[i]; //fill it using content of other 
     } 
    } 
    Foo(Foo&& other){ //move ctor 
     data=other.data; /* obvioulsly grab the other's pointer :) 
          * other is a temporary, so we don't have to 
          * allocate new array and copy other's content, 
          * because other is going to disappear soon. 
          */ 
     other.data=nullptr; /* Without this line, other and *this 
          * have the same pointer! 
          * When *this or other gets destroyed, 
          * it frees the data; second object 
          * doesn't know about the deletion, 
          * and may still want to use the data, 
          * causing undefined behavior by using fryed memory. 
          */ 
    } 
    ~Foo(){delete[] data;} //frees data 
}; 
+0

看起來很有趣。請詳細說明! – TobiMcNamobi 2014-10-06 11:24:13

+0

您刪除了一個無效指針。 – 2014-10-06 11:35:00

+1

沒有。刪除等於'nullptr'的指針什麼也不做:) – GingerPlusPlus 2014-10-06 11:37:10

相關問題