C/C++ 雑談 ID:6Sknau3+

12名無しさん@Next2ch:2017/12/15(金) 19:33:06.12 ID:6Sknau3+

これは GCC のバグだな

struct Source;

struct Target
{
  Target() = default;
  Target(Source const&){
    std::printf("OK\n");
    value = 0;
  }

  int value = -1;
};

struct Source
{
  operator Target(){
    std::printf("Bad\n");
    Target target;
    target.value = 1;
    return target;
  }
};

int main()
{
  Source source;
  Target target{source};
  std::printf("v = %d\n", target.value);
}

13名無しさん@Next2ch:2017/12/15(金) 19:39:54.89 ID:6Sknau3+

Target target{source} は direct-initialization であって
[over.match.ctor] より全てのコンストラクタがオーバーロードの候補となる

で overload resolution をするには implicit conversion sequence の優劣を比較するのだが
user-defined conversion sequence よりも standard conversion sequence の方が優先度が高い
だから上のプログラムは OK と表示しなければいけない (g++ -std=c++14 -pedantic ではそうなる) が
g++ -std=c++17 -pedantic では Bad と表示される

>>10 も同じバグに起因してると思う

……と bugzilla に報告しようと思ったら 5 年放ったらかしにしてたせいか
アカウント消えてた
どうせ誰か気づくだろうからここに書いてこの問題は俺の中で閉じた


このIDをNGリストに追加する

今後このIDの書き込みやスレッドを表示したくない場合、以下のボタンをクリックしてください。
NGリストに追加

レスを書き込む