2017-12-06 8 views
0

私は以下のヘッダファイルを宣言しました。 CPPファイルでstatic_assertで名前空間にconstexprを使用するとエラーが発生します

namespace G1 
{ 
    inline namespace V1 
    { 
     constexpr float getV(); 
    } 
} 

、私は私が示したように、バージョンを比較するstatic_assertを使用していますメインで

constexpr float G1::V1::getV() 
{ 
    return 0.1f; 
} 

としてgetV機能を定義しています。

int main() 
{ 
    static_assert(G1::getV() == 1.0f, "Error"); // Please Ignore the way I am comparing the floats 
    return 0; 
} 

しかし、私はコードをコンパイルするとき、私はexpression did not evaluate to a constantを取得しています。

ここで何か間違っていますか?私はVS2015を使用しています。事前

+0

'=='の代わりに '='を比較してください。 – Jarod42

+0

オススメして申し訳ありません、私は比較を変更しました。 – NJMR

+4

両方の機能は同じファイルにありますか?さもなければ、 'main'関数は' getV() 'が返すものをどのように知るべきでしょうか? –

答えて

3

実際には、C++コンパイルモデルは2フェーズです。最初にコンパイルし、次にリンクします。

constexprは、コンパイルフェーズでのみ動作します。コンパイラは、リンク時にconstexprの評価を必要とする場合には、関数本体を呼び出しサイトに移植する必要はありません。

constexpr機能の本体を提供できない場合、その本体であるを見ることができない人は、コンパイル時にで評価するのではなく、実行時まで待機します。

constexprは、「コンパイル時に実行される」という意味ではなく、「状況によってはコンパイル時に実行される」という意味ではありません。

2

で おかげであなたはコンパイル時でを返しgetV価値を知ってmainをコンパイルするコンパイラが必要な場合は、あまりにも、ヘッダー内の関数を実装する必要があります。 static_assertを使用しているため、コンパイル時に定義が必要です。

あなたがそれを行う方法は、getVを含む.cppファイルのコンパイラだけが何を返すかを知ることができます。これは通常、別のコンパイラ呼び出しです。

リンク時に、static_assertをチェックするのは遅すぎます。

エラーメッセージ:expression did not evaluate to a constantは、コンパイラが実装を知らないために発生します。 「ランタイム」コンテキストでは、リンカによって後で修正され実行時に実行されるように、ここにコールを挿入します。しかし、実行時呼び出しは決してコンパイル時定数ではありません。

関連する問題