私は "Visual Studio c++ 2010 Express" を使用しているのですが、
ネット上で、 "独自の拡張機能はオフにした方が良い" ということが書かれていたのでオフにしました。
そうしてプログラムを書いていると、それまでエラーが出なかった、ムーブコンストラクタ呼び出しの記述でエラーが出るようになってしまいました。
質問の内容といたしましては、
以下の記述が、 " 環境独自の拡張機能を使わなければ許されないような記述 " なのかどうかを教えて頂きたいというものです。
上記のような記述や、 " MyClass obj = MyClass(...); " のような記述は
(最適化されないと考えた時は) テンポラリオブジェクト (右辺値) を作って、それで左辺のオブジェクトを初期化すると思うのですが、
この時、コピーコンストラクタが隠されている場合にはエラーになるのが、正しい挙動なのでしょうか?
例えば、下記のコードは、"Visual Studio 2010 Express" (言語拡張機能オフ) では "privateメンバーにアクセスできません" というエラーが出てしまいます。
コピーコンストラクタが、private指定されているためだと思うのですが、文脈から考えてコピーコンストラクタにアクセスする必要がないように感じます。
言語の拡張機能をオンにすると何事もなかったように実行できました。(volatile は無視されるという警告は出ましたが...)
コピーコンストラクタではなく、ムーブコンストラクタが呼ばれることを期待しているのですが、拡張機能をオフにした状態で正しく呼ぶにはどうしたらよいのでしょうか?
/* ムーブコンストラクタを持つクラス */
class Test{
public:
Test() : m_num(0) {};
explicit Test(int num) : m_num(num){};
Test(Test&& obj);
private:
int m_num;
Test(const Test& obj);
};
/* ムーブコンストラクタの定義 */
Test::Test( Test&& obj){
this->m_num = obj.m_num;
obj.m_num = -999;
}
/* クラスを作成する関数 */
template<typename TYPE>
TYPE create(int arg){
return TYPE(arg);
}
int main(){
volatile Test obj1 = static_cast<volatile Test>( create<Test>(10) );
volatile Test obj2 = static_cast<volatile Test>( Test(20) );
return 0;
}