- hotwatermorning
- 2628
- 0
- 0
- 0
http://t.co/uWCGOxzj このコードがMacのclangさんで通らないのですよ… ldにおいてA::thのシンボルがないって言われる・・・
2012-01-08 02:23:59@rofi コンパイル時に解決できる場合は問題ないですが、この場合Boost.Lambdaのoperator<=がthへの参照を行うので実体が必要になってしまうんですね
2012-01-08 02:26:43@Flast_RO ord-useとは… んーっと、const staticで定義してあるので実体はあると思うのですが、これはダメなのですか…? gccではビルドが通る点がなおさらよくわからなくて…
2012-01-08 02:28:25@rofi んーgccが古いんだと思います手元の環境(4.6.3)ではリンクエラーですね static const int th = 100; はあくまで宣言なので、const int A::th;を何処かに書かないといけないです
2012-01-08 02:30:02@Flast_RO const static int th = 100; って宣言であって実体はないのですか? staticでconstならこれで実体も宣言されるものだと思ってたのですけど違うのですか…
2012-01-08 02:32:49@rofi yes クラス内のメンバ変数は全て宣言です static constなintegral typeが初期化できるように見えるのはそれがconstant expressionとなるのでconstant expression中で参照する分には実体がいらないですが、(続
2012-01-08 02:34:55@rofi もし参照をとるようなことを行うと、参照なので何か実体がないといけなくなってしまうので実体化を何処かで行わないといけないです。
2012-01-08 02:35:45@Flast_RO でもboost::lambdaって実体ない定数値って引数に取ることができましたよね? そうなるとstatic constなメンバ変数も同じように定数値と同じく引数に取れてもおかしくはないと思うのですが、それは無理なのでしょうか…
2012-01-08 02:38:27@Flast_RO ですです それと結果的には一緒(定数値直打ちじゃなくstatic constなのはスコープ持った名前で書きたいだけ)なので、それと等価に扱ってくれないのかなぁ〜と
2012-01-08 02:47:37@rofi _1>=0の場合は0がprvalueなので一時オブジェクトを生成してconst lvalue-refへ束縛できますが、const int thはlvalueなので一時オブジェクトの生成は行われずそのまま束縛をしようとします なので参照するために実体が必要です
2012-01-08 02:50:31@rofi 例えばC++11モードでstatic const intなメンバ変数をconst int &&へ束縛しようとするとエラーになるのが解ると思います。一方0をconst int &&へ束縛することはできます
2012-01-08 02:52:09@rofi _1 >= th を _1 >= int(th) にすると良いです。キャストのところでlvalue-to-rvalue conversionされて、th が odr-used でなくなるので……。
2012-01-08 03:26:28