2013. Do library implementers have the freedom to add constexpr?

0
kentn @kentdotn

とすると__attribute__((not_constexpr_in_std))を用意すれば(略

2013-10-22 19:30:23
狂える中3女子ボレロ村上/陶芸C++er @bolero_MURAKAMI

先程の例だと、「デフォルト引数が定数式であるか、もしくはデフォルト引数が真であるか」というSFINAEと(挙動を知っていれば)読めるので、これはこれで正常なSFINAEと言えるのでは、と。

2013-10-22 19:32:04
狂える中3女子ボレロ村上/陶芸C++er @bolero_MURAKAMI

で、これで挙動が違うようになるというのは、is_pointer<std::array<T,N>::iterator> が標準ライブラリの実装によって変わるというのと同程度の問題だと思うんですよ。arrayの場合はimplementation-definedだから完全に合法だけど。

2013-10-22 19:35:16
狂える中3女子ボレロ村上/陶芸C++er @bolero_MURAKAMI

つまり、constexpr の有無が規格違反だと決めても、実装依存だと決めても別に齟齬は生じない訳ですよ。SFINAEにおいても、直観的に罠だというだけで、矛盾が生じるわけではないので。

2013-10-22 19:38:32
狂える中3女子ボレロ村上/陶芸C++er @bolero_MURAKAMI

もし規格の中に、標準ライブラリのconstexprの有無の定めに"依存"するような文言ないしライブラリがある、もしくは追加されるかもしれない、ということであれば規格違反とするのは妥当だと思わざるをえないけれど、流石にそれはないやろ。

2013-10-22 19:42:22
kentn @kentdotn

@bolero_MURAKAMI 規格違反とした場合、ベンダーは「付けたくても付けられない」けどユーザーは「必ず付いていない」と確信してコードが書ける、実装依存だとベンダーは自由だがユーザーは確信が持てない、ということですよね?ユーザー側に倒したということでは?

2013-10-22 19:43:41
kentn @kentdotn

(いまさらC++erにその程度の手間を惜しませても、という話はあるけど)

2013-10-22 19:45:38
狂える中3女子ボレロ村上/陶芸C++er @bolero_MURAKAMI

. @kentdotn 確信が持てない、つまり実装依存と言うことであれば、実装の挙動を観察するSFINAEを書けてハッピーということになるし、逆に実装に依存しないように書くこともできるし、そもそも規格に明るくないユーザはそんなコードを書かないので問題ないのでは。

2013-10-22 19:46:19
狂える中3女子ボレロ村上/陶芸C++er @bolero_MURAKAMI

ADL が絡むと悲惨な罠になるおそれはあるけど、ADLの罠は今更……

2013-10-22 19:47:18
kentn @kentdotn

@bolero_MURAKAMI うーん、まあ現実に困ることはないですよね、きっと。というかC++11の既存コードでこれ使ってる人は既に規格から外れた環境で書いてることにされたわけで、何も救いがないわけで。実装依存にしてくれないと困るというか。

2013-10-22 19:50:00
Akso de la Malbono @Cryolite

ウオオオォォォ!!! well-formed な user code の observable behavior がGCC 4.9.0 http://t.co/YximDvjFgT と GCC 4.8.2 http://t.co/30ziVc5OMp で変化した!!!!!

2013-10-22 19:52:23
Akso de la Malbono @Cryolite

っていうか自分で書いておいてなんだけれど, GCC 4.8.2 と 4.9.0 で変化するのはさすがに自分も予想外だったので動揺しているwwwww

2013-10-22 19:53:27
kentn @kentdotn

@Cryolite これってC++14以降は厳密に従わないと規格違反なんでしょうけど、C++11にもさかのぼって影響するんですか?単にunspecifiedなままではなく?

2013-10-22 19:55:11
にゃははー仙人 @Flast_RO

そういえば、ランタイムで、sin(0.0)==0.0って保証されているんだろうかって疑問に思った 面白い

2013-10-22 19:57:14
Akso de la Malbono @Cryolite

あ,さっきのコード,標準ライブラリの関数群に対して constexpr を付けるかどうかの自由を許すか許さないかの議論からは脱線したコードだな.

2013-10-22 20:25:47
Akso de la Malbono @Cryolite

constexpr 関数の再帰の上限を SFINAE で検出できること自体は以前から知ってたんだけれど(https://t.co/cyncgrtQZ8 の問題の解答はもう分かったも同然だねっ☆),これを使えば標準化委員会に対してかなりシビアな議論を吹っ掛けるっことができるぞ.

2013-10-22 20:30:33
Akso de la Malbono @Cryolite

constexpr を標準ライブラリの関数群に付ける自由を許すと SFINAE による罠が発生するという理由でその自由を禁じる,というなら,現状,コンパイラに constexpr 関数の再帰回数の上限に関する自由を許すことによっても SFINAE による同様な罠が発生しうる.

2013-10-22 20:32:57
Akso de la Malbono @Cryolite

従って,上記の理由に基づいて constexpr を標準ライブラリの関数群に付ける自由だけを許さずに,コンパイラに constexpr 関数の再帰回数の上限に関する自由を許しているのは inconsistent だ!!!!!

2013-10-22 20:33:16
Akso de la Malbono @Cryolite

さあ!!!!! 標準化委員会よ!!!!! 「constexpr を標準ライブラリの関数群に付ける自由を許す」か「コンパイラに constexpr 関数の再帰回数の上限に関する自由も許さないか」のどちらか一方を選ぶ死の選択をせよ!!!!!

2013-10-22 20:33:40
Akso de la Malbono @Cryolite

constexprを標準ライブラリの関数群に付ける自由が殺されるっていうのなら,コンパイラに対するconstexpr関数の再帰回数の上限に関する自由も殺してやる!!!!! さあ!!!!!constexprを標準ライブラリの関数群に付ける自由を殺せるものなら殺してみなさいよ!!!!

2013-10-22 20:37:29
Akso de la Malbono @Cryolite

よし,この戦術で行こうっ☆

2013-10-22 20:40:41
狂える中3女子ボレロ村上/陶芸C++er @bolero_MURAKAMI

SFINAEの罠というのがそもそも罠じゃないというのがぼくの感じなのだけど、inconsistent というのは確かに議論として正着なのかな

2013-10-22 20:52:39
狂える中3女子ボレロ村上/陶芸C++er @bolero_MURAKAMI

「標準ライブラリの実装によって挙動が変わるSFINAE」というのはそもそも implementation-defined な部分すべてに言えることなのだし。

2013-10-22 20:54:12