:私はval
宣言からconstexpr
のコメントを解除した場合、このプログラムは、(++グラムでのみ-O0に、常に打ち鳴らすと)undefined reference to 'A::a'
とリンクに失敗しone-definition-rule-use(odr-use)はコンテキストに依存するのはなぜですか?以下のコードを考える
#include <iostream>
struct A {
static constexpr float a = 2.0f;
};
// non-const reference to make it more explicit - same behaviour
template<class T> constexpr inline T square(T& x)
{
return x * x;
}
int main() {
/*constexpr*/ float val = square(A::a);
std::cout << val;
}
は、しかし、それが適切にリンクします。
これまで私はconstexpr
をユニットファイルの1つで明示的な定義なしにodr-使用できないことを理解していますが、constexpr
に割り当てている間になぜ機能しないのか分かりません。
この2つのケースは、状況によって異なって扱われるようです。しかし、なぜ?どちらの場合でもコンパイラはコンパイル時にこの関数を評価するべきではありませんか?
投稿したスニペットは、GCCとCLANGの両方でうまくコンパイルされます。 – 101010
タイトルに珍しい頭文字語を使用しないでください。 – UmNyobe
@ 101010問題を見るために 'constexpr float val = square(A :: a);'から 'constexpr'を削除する – marcinj