odr-useにふれたよ!

C++難しいです。
0
🌸桜花🌸 @rofi

じゃなくてですね、わからないことが起こったので出てきたのですよ、はい   C++erはおらぬのかっ!!(

2012-01-08 02:22:54
🌸桜花🌸 @rofi

http://t.co/uWCGOxzj   このコードがMacのclangさんで通らないのですよ…  ldにおいてA::thのシンボルがないって言われる・・・

2012-01-08 02:23:59
にゃははー仙人 @Flast_RO

@rofi 19行目で_1 >= thって使ってますけどこれがord-useに触れるのでthの実体が必要になります

2012-01-08 02:25:15
にゃははー仙人 @Flast_RO

@rofi コンパイル時に解決できる場合は問題ないですが、この場合Boost.Lambdaのoperator<=がthへの参照を行うので実体が必要になってしまうんですね

2012-01-08 02:26:43
🌸桜花🌸 @rofi

@Flast_RO ord-useとは…  んーっと、const staticで定義してあるので実体はあると思うのですが、これはダメなのですか…? gccではビルドが通る点がなおさらよくわからなくて…

2012-01-08 02:28:25
にゃははー仙人 @Flast_RO

@rofi んーgccが古いんだと思います手元の環境(4.6.3)ではリンクエラーですね static const int th = 100; はあくまで宣言なので、const int A::th;を何処かに書かないといけないです

2012-01-08 02:30:02
🌸桜花🌸 @rofi

@Flast_RO const static int th = 100; って宣言であって実体はないのですか?  staticでconstならこれで実体も宣言されるものだと思ってたのですけど違うのですか…

2012-01-08 02:32:49
にゃははー仙人 @Flast_RO

@rofi yes クラス内のメンバ変数は全て宣言です static constなintegral typeが初期化できるように見えるのはそれがconstant expressionとなるのでconstant expression中で参照する分には実体がいらないですが、(続

2012-01-08 02:34:55
にゃははー仙人 @Flast_RO

@rofi もし参照をとるようなことを行うと、参照なので何か実体がないといけなくなってしまうので実体化を何処かで行わないといけないです。

2012-01-08 02:35:45
🌸桜花🌸 @rofi

@Flast_RO でもboost::lambdaって実体ない定数値って引数に取ることができましたよね?  そうなるとstatic constなメンバ変数も同じように定数値と同じく引数に取れてもおかしくはないと思うのですが、それは無理なのでしょうか…

2012-01-08 02:38:27
にゃははー仙人 @Flast_RO

@rofi それって_1 >= 0とかのことですかね

2012-01-08 02:41:28
🌸桜花🌸 @rofi

@Flast_RO ですです  それと結果的には一緒(定数値直打ちじゃなくstatic constなのはスコープ持った名前で書きたいだけ)なので、それと等価に扱ってくれないのかなぁ〜と

2012-01-08 02:47:37
にゃははー仙人 @Flast_RO

@rofi _1>=0の場合は0がprvalueなので一時オブジェクトを生成してconst lvalue-refへ束縛できますが、const int thはlvalueなので一時オブジェクトの生成は行われずそのまま束縛をしようとします なので参照するために実体が必要です

2012-01-08 02:50:31
にゃははー仙人 @Flast_RO

@rofi 例えばC++11モードでstatic const intなメンバ変数をconst int &&へ束縛しようとするとエラーになるのが解ると思います。一方0をconst int &&へ束縛することはできます

2012-01-08 02:52:09
pepshiso @pepshiso

@rofi _1 >= th を _1 >= int(th) にすると良いです。キャストのところでlvalue-to-rvalue conversionされて、th が odr-used でなくなるので……。

2012-01-08 03:26:28