假設我想編程接收器容器只移動 類型。根據Meyer和Sutter對 http://scottmeyers.blogspot.de/2014/07/should-move-only-types-ever-be-passed.html 的討論,sink參數應該按值傳遞,然後移入 成員。但就異常安全性而言,這聽起來對我來說似乎是一個不好的 想法。當構造函數拋出異常時,接收器參數的值將丟失,而當我通過右值引用並且在實際移動之前發生異常時,調用者仍然可以使用 檢索sink參數的值。下面接收器參數和例外
例子:
#include <memory>
#include <iostream>
#include <stdexcept>
using widget = std::unique_ptr<int>;
struct sink_1 {
sink_1(widget&& w) {
throw std::runtime_error("error");
w_ = std::move(w);
}
widget w_;
};
struct sink_2 {
sink_2(widget w) {
throw std::runtime_error("error");
w_ = std::move(w);
}
widget w_;
};
int main(int argc, char *argv[])
{
auto w1 = std::make_unique<int>(10);
auto w2 = std::make_unique<int>(20);
try {
sink_1 s1(std::move(w1));
} catch (std::runtime_error &e) {
std::cout << *w1 << std::endl;
}
try {
sink_2 s2(std::move(w2));
} catch (std::runtime_error &e) {
std::cout << *w2 << std::endl; // crashes
}
return 0;
}
這是一個有效的和好的設計?
只是爲了給網站他們當之無愧的信用:如果你有完整的工作代碼,你的問題實際上可能更適合[SE代碼審查](http://codereview.stackexchange.com/)。 –