suzuzusu日記

(´・ω・`)

constexprにおけるused before its definition

C++のconstexprで少し詰まったので忘備録として書く。

// mylib.h
constexpr int square(int x);
// mylib.cpp
#include "mylib.h"

constexpr int square(int x){
    return x*x;
}
// main.cpp
#include "mylib.h"

int main(){
    constexpr int result = square(5);
    static_assert(result == 25, "error");
    return 0;
}

上記のC++によくあるようなファイル構成のものをGCC5.3.0で-std=c++11オプションをつけてコンパイルしようとすると‘constexpr int square(int)’ used before its definitionというエラーが吐かれる。原因は以下に記述する。

N2235の4.1より

A constant expression function must be defined before its first use.

// N2235にあるサンプルコード

struct S {
    constexpr int twice();
    constexpr int t();
    private:
    static constexpr int val; // constexpr variable
};

constexpr int S::val = 7;
constexpr int S::twice() { return val + val; }
constexpr S s = { };
int x1 = s.twice(); // ok
int x2 = s.t(); // error: S::t() not defined
texpr int ff(); // ok
constexpr int gg(); // ok
int x3 = ff(); // error: ff() not defined
constexpr int ff() { return 1; } // too late
constexpr int gg() { return 2; }
int x4 = gg(); // ok

原因は分かったがどんなファイル構成にすればいいのかイマイチ分からない。 誰か教えてほしい。

include "mylib.h"ではなくinclude "mylib.cpp"にするとか(?)

参考

stackoverflow.com

stackoverflow.com

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf