50783


c++初学者です。  
constexprを試してみたく簡単な関数を作ってみました。

[code]

    #include<iostream>
    
    constexpr int f(int);
    
    int main(){
    
        constexpr int a = 10;
        constexpr int b = f(a);
    
        std::cout << b << std::endl;
    
        return 0;
    }
    
    constexpr int f(int a){
        return a * a;
    }
    
[/code]

しかしこのコードをコンパイルするとコンパイルエラーになります。

[code]

    ts.cpp:8:19: error: constexpr variable 'b' must be 
    initialized by a constant expression
        constexpr int b = f(a);
                  ^   ~~~~
    ts.cpp:8:23: note: undefined function 'f' cannot be 
    used in a constant expression
        constexpr int b = f(a);
                      ^
    ts.cpp:3:15: note: declared here
    constexpr int f(int);
              ^
    1 error generated.
    
[/code]

関数の定義をする前に関数を呼ぶことはできないのでしょうか?

言葉が間違っているかもしれませんが、コンパイル時に計算するといことはリンカが関数を探す前に関数が呼ばれていて未定義関数のエラーが出ているのでしょうか?


CC BY-SA 4.0
2018-11-30T07:22:39.213
50776
2018-11-30T08:33:17.777
28294
question
c++
C++ constexpr関数について


[`constexpr`の仕様](https://cpprefjp.github.io/lang/cpp11/constexpr.html)によると、

[code]

    constexpr関数は暗黙的にインラインとなる
    
[/code]

とあるので、宣言だけの関数では呼び出せないためと思います。  
(エラーメッセージにも「 **undefined** function 'f' cannot be used in a constant
expression`」とあります)

なお、この仕様は`constexpr`特有のもので、通常の変数初期化であれば、関数の宣言だけでもコンパイルは通ります。(その場合、`constexpr`の効果はなくなると思います)


CC BY-SA 4.0
2018-11-30T08:33:17.777
50783
2018-11-30T08:33:17.777
20098
50776
answer