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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
aguna
記事: 2
登録日時: 8年前

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

#1

投稿記事 by aguna » 8年前

このコードが実行時エラーになるのですが、仕様でしょうか?
環境は、VC++ visualstudio2017です。

コード:

#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;
}
最後の代入のところでエラーになります。

sleep

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

#2

投稿記事 by sleep » 8年前

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

コード:

#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 };
}

aguna
記事: 2
登録日時: 8年前

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

#3

投稿記事 by aguna » 8年前

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

返信

“C言語何でも質問掲示板” へ戻る