合計 昨日 今日

クラスメンバの無名共用体のstd::string

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: aguna
[URL]
ぴよぴよ(51 ポイント)
Date: 2017年8月12日(土) 07:41
No: 1
(OFFLINE)

 クラスメンバの無名共用体のstd::string

このコードが実行時エラーになるのですが、仕様でしょうか?
環境は、VC++ visualstudio2017です。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
using namespace std;
 
class A
{
public:
    A() {};
    ~A() {};
    std::string str1;
    union   { std::string str2; };
};
 
int main() {
    A a;
    a.str1 = "Hello";
    a.str2 = a.str1;
}


最後の代入のところでエラーになります。

Name: sleep
[URL]
Date: 2017年8月12日(土) 08:42
No: 2
(OFFLINE)

 Re: クラスメンバの無名共用体のstd::string

共用体の制限解除(C++11)
・共用体の非静的メンバ変数として定義されている非自明なコンストラクタおよびデストラクタを持つ型のオブジェクトに対しては、配置new構文でオブジェクトを構築し、明示的にデストラクタを呼び出す必要がある

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
using namespace std;
 
class A
{
public:
    A() {};
//  ~A() {};
    ~A() { str2.~basic_string(); };
    std::string str1;
    union { std::string str2; };
};
 
int main() {
    A a;
    a.str1 = "Hello";
//  a.str2 = a.str1;
    new (&a.str2) std::string{ a.str1 };
}

Name: aguna
[URL]
ぴよぴよ(51 ポイント)
Date: 2017年8月12日(土) 08:47
No: 3
(OFFLINE)

 Re: クラスメンバの無名共用体のstd::string

[解決!]

なるほど!構造体と同じようにはできないんですね!
unionは謎だらけですね…
どうもありがとうございました!


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[38人]