江添亮のブログ, GitHub, 本の虫@GitHub, @EzoeRyou
void f(...) ;
この...を、ellipsisという。ellipsisとは、英和辞書的にいえば、省略とか、リーダーと訳される。
しかし、世間一般には、可変引数リストという名称も用いられている。これは、...自体の名称としては、あまり適切ではない。おそらくは、K&Rの邦訳の、printfの実装例で、可変引数リストと書いてあるのが、そのまま用いられているのではないかと思われる。
邦訳のK&Rの、言語の定義では、省略形という言葉が用いられている。さて、どうするか。
これは難しいですね。自分としては省略形ですかね。省略形と可変引数listは概念のlevelが違うと思います。可変引数listを示すために省略形を用いているということではないでしょうか。
可変引数リストといったら、<cstdarg>で定義されているマクロの使用まで含めるのが、私としての感覚です。
「...」は省略記号とでも呼ぶとして、使用に際しての意味あいはむしろ「ワイルドカード」が近い。たしかに何と呼べばいいのか難しいところです。
本題とずれて申し訳ないのですが引数に省略子だけを書いた時の仕様ってどうなってるんでしょうか。規格書を見てもいまいちわかりません。省略子だけの場合は関数内部から引数を参照できないのですから(ポインターを駆使すれば別ですが)スタックを確保する必要がなければ引数のコピーコンストラクターを呼ぶ必要もデストラクターを呼ぶ必要もないはずです。しかしgccは省略子だけの場合とその他の引数が付いている場合を区別していないらしく省略子だけの場合でも何らかの処理をしているようでPODじゃないオブジェクトを渡すと異常終了します。こまかい仕様がわかればこれもバグとして報告することもできるんですが。// gccの状態void Function(...){}Function( std::string("Example") ); // abortする。// 理想void Function( A &object0, B const &object1 );void Function( C &object0, B const &object1 );void Function( ... );template Call( Type &object ){ Function( object, B() ); // TypeにAとC以外を指定した場合は省略子の関数をabortせずに実行する。}
object1クラスが非トリビアルなコピー/ムーブコンストラクター、デストラクターなどを持つ場合、そのコードが実装によってサポートされるかどうかは、規格上どちらでもよい。GCCの挙動は規格準拠。
ありがとうございました。https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/SFINAE上記のようにfallback先として使われていることがありますが危険なんですね。しかし、fallbackとしても使えないなら省略子だけの引数は何に使えばいいのでしょう?
Post a Comment
6 comments:
これは難しいですね。自分としては省略形ですかね。省略形と可変引数listは概念のlevelが違うと思います。可変引数listを示すために省略形を用いているということではないでしょうか。
可変引数リストといったら、<cstdarg>で定義されているマクロの使用まで含めるのが、私としての感覚です。
「...」は省略記号とでも呼ぶとして、
使用に際しての意味あいはむしろ「ワイルドカード」が近い。
たしかに何と呼べばいいのか難しいところです。
本題とずれて申し訳ないのですが引数に省略子だけを書いた時の仕様ってどうなってるんでしょうか。
規格書を見てもいまいちわかりません。省略子だけの場合は関数内部から引数を参照できないのですから
(ポインターを駆使すれば別ですが)スタックを確保する必要がなければ引数のコピーコンストラクターを呼ぶ
必要もデストラクターを呼ぶ必要もないはずです。しかしgccは省略子だけの場合と
その他の引数が付いている場合を区別していないらしく省略子だけの場合でも何らかの処理をしているようで
PODじゃないオブジェクトを渡すと異常終了します。こまかい仕様がわかればこれもバグとして報告することもできるんですが。
// gccの状態
void Function(...)
{
}
Function( std::string("Example") ); // abortする。
// 理想
void Function( A &object0, B const &object1 );
void Function( C &object0, B const &object1 );
void Function( ... );
template Call( Type &object )
{
Function( object, B() ); // TypeにAとC以外を指定した場合は省略子の関数をabortせずに実行する。
}
object1クラスが非トリビアルなコピー/ムーブコンストラクター、デストラクターなどを持つ場合、そのコードが実装によってサポートされるかどうかは、規格上どちらでもよい。GCCの挙動は規格準拠。
ありがとうございました。
https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/SFINAE
上記のようにfallback先として使われていることがありますが危険なんですね。
しかし、fallbackとしても使えないなら省略子だけの引数は何に使えばいいのでしょう?
Post a Comment