C++相談室 part166 (390レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

20
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 6332-6RYV) [sage] 2025/05/06(火) 12:35:30.96 ID:SvTeM3j90(1/6) AAS
declval は要らんな。
もっとキッチリしたほうがいいのか簡素にしようか迷ってちょっと変な感じになってる……。
22
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 6332-x8bn) [sage] 2025/05/06(火) 13:42:19.73 ID:SvTeM3j90(2/6) AAS
>>21
21(1): デフォルトの名無しさん (ワッチョイ a701-uYIY) [sage] 2025/05/06(火) 13:03:38.40 ID:tCHDdC6b0(2/3) AAS
>>20
いやいや非難ではなく
俺が知っているC++じゃないw
- operatorの前のautoは何ぞ?
- !!演算子?
関数名の前に auto を書くと仮引数の後ろに返却値の型を書けるようになる。
つまり -> から { までのところに書いてるのが返却値の型。

従来の書き方では関数の仮引数を返却値の型を決定する文脈では使えないというルールがある。
たとえば
template<class T> decltype(e) foo(const T& e) {return e;}
というようなことは出来ない。 ここで e を参照することは出来ない。

後置では返却値の型を書くところで仮引数を使ってかまわない。
template<class T> auto bar(const T& e) -> decltype(e) {return e;}
ってのはアリ。

この場合の auto は返却値の型を後置するというマークってことね。
後置にする必要がなくても後置で一貫させてるプロジェクトもたぶん結構ある。
auto がこのような用途で使えるようになったのは C++11 からなのでもう結構浸透してると思うんだけど、全く見たことないの?

!! は ! をふたつ並べてるだけ。 bool にキャストする代わりに使うイディオムなんだけど見づらいからやめたほうがよいという人も多い。
24: はちみつ餃子◆8X2XSCHEME (ワッチョイ 6332-x8bn) [sage] 2025/05/06(火) 16:07:03.30 ID:SvTeM3j90(3/6) AAS
>>23
23(1): デフォルトの名無しさん (ワッチョイ a701-uYIY) [sage] 2025/05/06(火) 14:29:32.39 ID:tCHDdC6b0(3/3) AAS
>>22
解説を有難うございます
返り値を後置する記法のアドバンテージが分かりました
>>18は返り値を後置にしてるけどもこれは必須ではないということね
!!も分かりました(g++-12はなしで通ります)
> !!も分かりました(g++-12はなしで通ります)

非型テンプレートパラメータで size_t (sizeof の結果) から bool への変換 (縮小変換) は認められていないはず……
……と思ったらこれには例外があってコンパイル時計算の文脈で実際には情報が欠落しないなら OK。
つまり整数の 0 か 1 のときに限り (型の大きさとしては小さくなる変換であっても) bool に変換が可能。
26: はちみつ餃子◆8X2XSCHEME (ワッチョイ 6332-x8bn) [sage] 2025/05/06(火) 18:05:53.77 ID:SvTeM3j90(4/6) AAS
>>25
25(1): デフォルトの名無しさん (ワッチョイ 1279-k14q) [sage] 2025/05/06(火) 17:28:20.12 ID:GbYxwNEQ0(1) AAS
非0ならtrueやないんか
せやで。 こういうときは変換されない。

template<bool num>
class foo {};

int main(void) {
foo<2> bar;
}

通常の暗黙の変換で許されていても非型テンプレートパラメタでは縮小変換はされないので↓みたいなのも駄目。

template<unsigned char num>
class foo {};

int main(void) {
foo<1000> bar;
}
29
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 6332-x8bn) [sage] 2025/05/06(火) 19:26:25.22 ID:SvTeM3j90(5/6) AAS
この場合は enable_if は本来の意味で使ってないしな。
30
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 6332-x8bn) [sage] 2025/05/06(火) 20:07:39.20 ID:SvTeM3j90(6/6) AAS
>>27
27(1): 15 (ワッチョイ afaa-hOut) [sage] 2025/05/06(火) 18:35:49.00 ID:jhNAw2EC0(1/2) AAS
>>18
重ね重ねありがとうございます。
なんとか理解してみます。

C++20だとどうなります?
一応、C++の新機能ってぺージ見たんですけど、よくんからなくて
こんな感じかな。
外部リンク:wandbox.org

C++20 からはイテレータの概念も再編されて range という概念で扱うのが好ましいということになり、コンテナは range の一種だったことになった。
コンテナの中のここからここまでという範囲を表すものを中心にした考え方で、コンテナ自身も range だし、コンテナの除き窓のような view も range 。
Rust とか Go で言うスライスみたいなもん。

で、テンプレート引数として受け取った T が std::ranges::range の制約を満たすものなんやでという制約を入れることによってそうじゃないものはマッチしないように出来るし、
他の operator<< の候補にマッチするものがあるのならそっちが選ばれるようになる。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.960s*