質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2886閲覧

autoでinitializer_list<T>型を推論できない問題

JADEN

総合スコア106

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

1クリップ

投稿2016/02/27 06:42

以下のコードが、コンパイルエラーになります。
コンパイラ: MSVC

C++

1#include <iostream> 2 3int main() { 4 auto x {1, 2}; 5 std::cout << x.begin()[0] << std::endl; 6}

ビャーネ・ストラウストラップ「プログラミング言語C++第4版」の174ページに、上記構文が書いてあります。

以下のサイトで、MSVCは、初期化子リストに対応と書いてありますが、なぜコンパイルエラーになるのでしょうか。
MSVSのC++11のサポート

argius👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

各コンパイラで試してみました。

  • Clang (Xcode 7.2.1)
    => 警告が表示されるがコンパイルでき、正常に動作。

  • GCC 5.3.0 (homebrew版とmsys2のmigw-w64-x86_64版の両方)
    => そのままではエラーになるが、-fpermissiveオプションを付けることで警告付きでコンパイルはでき、正常に動作。

  • Visual C++ 2015 (Visual C++ Build Tools 2015でインストール)
    => エラー(C3518)になる。回避方法不明。

このエラーについて調べると下記のMSDNフォーラムが見つかります。
Visual Studio "14" CTP - C3518 Error
Visual C++のコンパイラではブレース初期化リストでのauto推論の新ルールの提案を採用しているため、エラーになるという回答です。この新ルールでは、auto x{ 1, 2 };はエラーとするとなっています。なお、GCCがデフォルトエラーになる、Clangでは警告になるのも同じ提案を採用しているためと思われます。

C++11としては正しいようですし、C++14でも"-std=c++14"付きでできたので問題ないかも知れません。しかし、将来のバージョン(次はC++17でしょうか)では提案が採用されてエラーになる可能性があります。この書き方は使わない方が良いでしょう。

投稿2016/02/27 08:33

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JADEN

2016/02/27 10:12

回答ありがとうございます。
guest

0

こんにちは。

auto x={1, 2};の書き間違いではないでしょうか?
ここをみると、auto x {1, 2};のような構文は記載されていないようです。

投稿2016/02/27 06:58

編集2016/02/27 07:47
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JADEN

2016/02/27 07:11 編集

回答ありがとうございます。 ストラウストラップの本には、アップしたコードが書かれています。 C++11から導入された int x {1} などに対してautoを適用したものだと思います。
Chironian

2016/02/27 07:47

なるほど。 検索してみると、↓がありました。 http://pegacorn.hatenablog.jp/entry/2015/04/22/122240 C++17でauto y{1};の意味が変わるようです。C++17ではこのように書くとyはint型になるらしい。で、やってみたら、MinGW, msvcの両方でint型になりました。 もしかすると、C++17ではauto x{1, 2};の構文を禁止しているのかもしれません。 auto x={1};の場合std::initializer_list<int>で、auto x {1};の場合intになるってなかなか嫌かも。 そして、現存のコンパイラはそれを先取りしているとか? 禁止構文を使ったソースが増えると頭が痛いですから。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問