[解決済み] なぜ `std::move` を `const` オブジェクトに使うことができるのですか?
2022-05-10 07:54:19
疑問点
C++11では、このようなコードを書くことができます。
struct Cat {
Cat(){}
};
const Cat cat;
std::move(cat); //this is valid in C++11
を呼び出すと
std::move
を呼び出した場合、それはオブジェクトを移動させたい、つまりオブジェクトを変更することを意味します。を移動させるには
const
オブジェクトを動かすことは理不尽なことですが、ではなぜ
std::move
はこの振る舞いを制限しないのでしょうか? 将来的に罠にはまりそうですよね?
ここでいうトラップとは、ブランドンがコメントで述べているような意味です。
もし彼が気づかなかったら、彼は自分の意図しないコピーを手に入れてしまうからです。 なぜなら、もし彼が気づかなければ、彼は意図しないコピーで終わってしまうからです。
Scott Meyers による「Effective Modern C++」という本の中で、彼は例を挙げています。
class Annotation {
public:
explicit Annotation(const std::string text)
: value(std::move(text)) //here we want to call string(string&&),
//but because text is const,
//the return type of std::move(text) is const std::string&&
//so we actually called string(const string&)
//it is a bug which is very hard to find out
private:
std::string value;
};
もし
std::move
の操作が禁止されていた場合
const
オブジェクトの操作が禁止されていれば、簡単にバグを発見することができますよね?
どのように解決するのですか?
struct strange {
mutable size_t count = 0;
strange( strange const&& o ):count(o.count) { o.count = 0; }
};
const strange s;
strange s2 = std::move(s);
ここでは
std::move
の上に
T const
. を返します。
T const&&
. に対する移動コンストラクタがあります。
strange
に対して、まさにこの型を取る移動コンストラクタがあります。
と呼ばれるものです。
さて、この奇妙な型は、あなたの提案が修正するバグよりも稀であることは事実です。
しかし、その一方で、既存の
std::move
は一般的なコードではより効果的で、作業している型が
T
なのか
T const
.
関連
-
[解決済み] std::string を const char* または char* に変換する方法
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] マクロで無意味なdo-while文やif-else文を使っているのはなぜですか?
-
[解決済み] std::move()とは何ですか?また、どのような場合に使用するのですか?
-
[解決済み] const std::string & をパラメータとして渡す時代は終わったのでしょうか?
-
[解決済み] std::stringをintに変換するにはどうしたらいいですか?
-
[解決済み] 関数のパラメータに 'const' を使用する
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】デバッグアサーションに失敗しました