重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【解消】通知が届かない不具合について

constexpr int test() {
constexpr std::array<int, 7> a = {5, 3, 2, 9, 1, 0, 4};

for (const int e : a) { // range-based for
}

return 0;
}

C++ における constexpr について、range-based for の行でコンパイルエラーが発生する原因を教えて下さい。
エラー内容は、
「エラーの原因は未定義関数の呼び出しまたは 'constexpr' が宣言されていない呼び出しです
test.cpp(8): note: 'std::array<int,7>::_Unchecked_begin' の使用量を参照してください」
で、環境は Visual Studio 2019 です。
std::array<int,7>::begin や std::array<int,7>::end は constexpr 関数でしたが…

まだ未対応ということなのでしょうか?

A 回答 (3件)

原因はよく分りませんが、当方の環境 (Visual Studio 2019 Version 16.5.4) で、プロジェクトのプロパティ→[全般]→[C++ 言語標準]を“ISO C++17 標準 (std:c++17)”にするとコンパイルエラーにはなりませんでした。


“ISO C++14 標準 (std:c++14)”では同じようなエラーになりました。
デフォルトでは "C++14" だったと思います。

詳細は把握していませんが、標準規格でも "constexpr" の扱いは結構変遷があったようなので、それが原因かも知れません。

ここのページ (https://cpprefjp.github.io/lang/cpp14/relaxing_c … )によると C++14 で変わっているはずですが、VC で扱いは違うのかもしれません。

蛇足ですが、g++ でも -std=c++14 ではエラーになりました。
    • good
    • 0
この回答へのお礼

ありがとうございました。
解決しました。
既定=C++ 14
が原因でした。

お礼日時:2020/05/10 14:46

std::array::begin が constexpr になったのは C++17>#2.

    • good
    • 1

手元で確認した限りでは, begin や end は constexpr になっていない. なので, (少なくとも手元においては)

それが原因.
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!