在C++ 98/03/11中的下面的代碼是有效的:修改臨時文件不正確嗎?
std::string meow() { return "meow"; }
int main()
{
meow().append("purr");
return 0;
}
由於在分號臨時模具,這應該是安全的嗎?
在C++ 98/03/11中的下面的代碼是有效的:修改臨時文件不正確嗎?
std::string meow() { return "meow"; }
int main()
{
meow().append("purr");
return 0;
}
由於在分號臨時模具,這應該是安全的嗎?
這並不正確,在某些情況下這樣做很有用。
假設我有很多數據的載體,我要清除的數據和存儲..
{
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")
我知道這只是一個例子,但如果有人不知道..在C++ 11中,你可以使用'shrink_to_fit' – 2014-10-06 11:13:00
@NeilKirk'shrink_to_fit'不具有約束力。 – 2014-10-06 11:29:09
不,但它暗示編譯器。我們相信編譯器會在需要時進行其他優化,爲什麼不這樣呢? – 2014-10-06 11:34:34
這是合法的,並且有用:
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
};
看起來很有趣。請詳細說明! – TobiMcNamobi 2014-10-06 11:24:13
您刪除了一個無效指針。 – 2014-10-06 11:35:00
沒有。刪除等於'nullptr'的指針什麼也不做:) – GingerPlusPlus 2014-10-06 11:37:10
如果你想阻止這種行爲,你可以實際上返回一個'const std :: string'。 – pmr 2014-10-06 11:15:02