[解決済み] initializer_list と移動のセマンティクス
質問
の外に要素を移動することはできますか?
std::initializer_list<T>
?
#include <initializer_list>
#include <utility>
template<typename T>
void foo(std::initializer_list<T> list)
{
for (auto it = list.begin(); it != list.end(); ++it)
{
bar(std::move(*it)); // kosher?
}
}
以降
std::intializer_list<T>
はコンパイラの特別な注意を必要とし、C++ 標準ライブラリの通常のコンテナのような値セマンティクスを持たないので、むしろ安全策をとって尋ねることにします。
どのように解決するのですか?
いいえ、それは意図したとおりには動作しません。私は、次のように考えていたので、これにはかなり驚いています。
initializer_list
が存在し、テンポラリの配列を、それらが
move
'd.
begin
と
end
に対して
initializer_list
戻る
const T *
の結果は
move
の結果は
T const &&
- であり、不変のrvalue参照です。このような式は意味のある移動ができません。これは関数パラメータにバインドされ
T const &
型の関数パラメータにバインドされ、rvalueはconst lvalue参照にバインドされるため、コピーセマンティクスが表示されます。
おそらくこの理由は、コンパイラが
initializer_list
を静的に初期化された定数とすることをコンパイラが選択できるようにするためだと思われますが、その型を
initializer_list
または
const initializer_list
を期待するのか、それともコンパイラの裁量に任せるのか、 ユーザはわかりません。
const
の結果を期待するのか、それともミュータブルな結果を期待するのか、 ユーザにはわかりません。
begin
と
end
. しかし、これは私の直感に過ぎず、おそらく私が間違っている正当な理由があるのでしょう。
更新しました。
私が書いたのは
ISO 提案
のために
initializer_list
のサポートに関する ISO 提案です。まだ最初の草案であり、どこにも実装されていませんが、問題のより詳しい分析のために見ることができます。
関連
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] ムーブセマンティクスとは何ですか?
-
[解決済み] std::move()とは何ですか?また、どのような場合に使用するのですか?
-
[解決済み] C++11 rvalues と移動セマンティクスの混乱(return 文)
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?