C++相談室 part166

1sage (ワッチョイ 8732-NXaD)
垢版 |
2025/04/26(土) 10:34:58.41ID:pbPDl6lv0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part165
https://mevius.5ch.net/test/read.cgi/tech/1698705458/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
753デフォルトの名無しさん (ワッチョイ 1f42-q6Sd)
垢版 |
2025/11/15(土) 19:39:44.33ID:ncudN0/g0
分かりやすいように749みたいに書いたけど、747で普通に意味が通じるので、「ではなく」というとちょっと違う気がするかな。言葉って難しい。
2025/11/16(日) 01:00:07.67ID:oagsDxeg0
こういう人が仕様書読んで実装すると思うとこわい
755デフォルトの名無しさん (アウアウウー Sa85-H7iN)
垢版 |
2025/11/16(日) 13:18:16.47ID:0LN83zrSa
横からだけど
>>747 で充分判る
>>748 は本当に日本人か?
2025/11/16(日) 13:32:50.84ID:Xh/GBEYv0
C++ばっかりやっとるからだよ
日本語を使え
757デフォルトの名無しさん (ワッチョイ 0dda-43h0)
垢版 |
2025/11/16(日) 16:38:31.73ID:r6khXsKc0
>>755
>748だけど日本人だよ。
>747日本語の文法としておかしいと思うんだが分かるんか…。
こっちが年食ったんかなぁ…。
2025/11/16(日) 16:49:19.65ID:D8AV/AUw0
あんたは機能的非識字なんでしょ
歳とか関係ないって
759デフォルトの名無しさん (ワッチョイ 91df-iLwu)
垢版 |
2025/11/16(日) 18:20:15.84ID:fnmgx6dT0
747は、日本語の文法としておかしなところは別にないけれども、748のような読み方も許すという点で多義的な文にはなっているかな。
「C++より〜ように」という前半の文脈があるので748のような受け取り方はしない方が普通だと思うが、文法的には748のような読み方も一応可能だろう。
「使用可能(ということ)で良かった」としたら、完全に一義的になっているとまでは言えないまでも、多少ニュアンスは明確になっているかな。そうでもないか。
2025/11/16(日) 19:06:28.66ID:B8gkzotY0
>>757
文字なんでニュアンスが伝わりづらいだけだよ

「この前の件だけど、両方出来るようになったよ」
「他と同じように片方のみで良かったと思うよ」

まあ誤解を与えない書き方とすると

「他と同じように片方のみで良かったのにと思うよ」
って感じで「のに」をいれた方が残念がっている様子が伝わってくるよね
761デフォルトの名無しさん (ワッチョイ e9f6-iLwu)
垢版 |
2025/11/17(月) 09:06:44.31ID:g7E0m0EQ0
C++はよく分からないので、cpprefjpにはいつもお世話になっているんだけど、生文字列リテラルのところにある「改行が入力された場合、改行の制御文字 '\n' に変換される」というのは説明として正確なのかな。
raw文字列リテラルのところの規格にはそれっぽいことは書いていないように思うし、改行文字は通常の文字としてそのままraw文字列リテラルに含められるだけであって、別に「変換」とかはされていないんじゃないかと思うんだけど。
2025/11/17(月) 10:18:46.23ID:DdlSQj440
>>761
'\n' に変換するという説明は誤りだと私も思う。
規格内の例中では \n と同等というような説明はあるのでこれを変換と誤解したのかも?
https://timsong-cpp.github.io/cppwp/n4950/lex.string#5
2025/11/17(月) 10:27:40.74ID:DdlSQj440
余談だけど生文字列リテラルの扱いにはちょっと変な特別扱いがある。
C++ では処理の初期段階で行を連結 (改行を削除) してしまうことになっていて、その時点では各改行が生文字列リテラルの中なのかどうか認識してない。
https://timsong-cpp.github.io/cppwp/n4950/lex#phases-1.2
後でトークンを分割するときになって生文字列リテラルを認識したらその範囲では連結を「取り消す」という処理が入る。
https://timsong-cpp.github.io/cppwp/n4950/lex#pptoken-3.1
結果としては改行はそのまま含まれるだけなんだけど、理屈としては色々な操作 (変換?) はされてる。

ただ、これは C++ の言語の解釈の話であって処理系の実装方法ではない。
つまり結果が同じであれば実装方法は問わないので連結してから取り消すのではなく連結の例外にしてもかまわないし、
生文字列リテラルを普通の文字列リテラルに変換するような手法もあるのかもしれない。
2025/11/17(月) 20:16:57.16ID:3c799E+W0
>>761
gccにCRLF改行のソースコードを食わせてもLF(\n)だけになったので変換はされてるんじゃないか
他のコンパイラの動作はしらね
765デフォルトの名無しさん (ワッチョイ 6e10-iLwu)
垢版 |
2025/11/18(火) 02:43:23.41ID:oTdu6LNz0
>>763
削除されるのは「\(改行)」(Pythonとかでは明示的な行継続と言われているやつ)みたいなやつだけで、(\ に後続しない)単なる改行はwhitespace文字として扱われるだけかと思っていたんだけど。

>>764
改行をLFだけにする(正規化?)のは、raw文字列リテラルに限らない共通の処理なのでは。
2025/11/18(火) 07:15:20.89ID:cPKOUaFd0
規格が決めてるのはソース中の論理的な「改行」の振る舞いであって、そのバイト表現は知ったこっちゃないって奴じゃないの
知らんけど
2025/11/18(火) 10:05:52.54ID:BySuHnsX0
>>766
従来はそうだったはずだけど C++23 からは Unicode (UTF-8) のコードポイントの並びで規定されていて、 CRLF が単一の改行に置き換えられる規則が明記されてる。
ただ、 Unicode 系以外の文字コードから処理系定義の規則で Unicode に適当にマッピングするようなのも認めているので実態はあまり変わらない。
768デフォルトの名無しさん (アウアウウー Sa85-H7iN)
垢版 |
2025/11/18(火) 23:53:18.65ID:+AochNn2a
>>764-765
termcapだかterminfoだかでゴニョゴニョ
2025/11/19(水) 15:04:12.19ID:HRoC/CWNM
>>768
関係ない
2025/12/13(土) 08:54:58.15ID:WPESu7ut0
LF <--> CR LF 変換はI/Oの段階で行われるものだという印象
証拠に、"\r\n" をテキストモードでファイルに書くと "\r\r\n" になり、
それをテキストモードで読むと "\r\n" に戻るのは万国共通のふるまいのはず(適当
(バイナリモードだともちろん文字列リテラルとファイルのデータ両方 "\r\n"。
すなわちC/C++言語における文字列リテラルの改行は古来より "\n" の1文字……

なので
>従来はそうだったはずだけど C++23 からは Unicode (UTF-8) のコードポイントの並びで規定されていて、 CRLF が単一の改行に置き換えられる規則が明記されてる。
こそ
>(ソースコード上の生文字リテラル内での行の折り返しを)「改行が入力された場合、改行の制御文字 '\n' に変換される」
ことの根拠になっているのでは……

で、
>Unicode 系以外の文字コードから処理系定義の規則で Unicode に適当にマッピングするようなのも認めているので
というのは "\r\n" <--> "\n" の変換(文字数が違う)を正当化しないと思う
2025/12/13(土) 09:19:18.23ID:WPESu7ut0
>>763
のは次のような特殊なケースでのみ問題になるだけなのではないかという希ガス
#define TEXT_DEFINITION R"(begin\
a,\
b,\
c\
end)"
std::string text = TEXT_DEFINITION; // textの内容が "(begin\na\nb\nc\nend)" になることを気体

初期段階、と書かれるとようわからんが、行を結合するのはプリプロセッサが行うだけのはず……
C/C++は文脈自由言語でありかつ改行文字はトークンでないから、パーサー部分が行を結合する必然性が無い
772デフォルトの名無しさん (ワッチョイ 7746-RIfS)
垢版 |
2025/12/13(土) 10:11:52.86ID:c4oXW2530
プラットフォームごとの改行コードに合わせた変換がI/Oの段階で行われるのはそうだろうけど(たとえばPythonは変換仕様の細かい指定がprint関数でできるし、他の言語でも同様の機能があることが多いのではないかと思う。なので、\r\nと\r\r\nの変換が万国共通ということは別にないはず)、規格で規定されているのはソースコードをコンパイルする前処理としての改行コードの正規化(?)の話であって、別の話なのではないかと思うが。
2025/12/13(土) 10:26:05.41ID:WPESu7ut0
>>772
>\r\nと\r\r\nの変換が万国共通ということは別にないはず
>>770 の前段のは、
C/C++のバイナリモードとテキストモードのI/Oの挙動がC/C++言語の文字列リテラル内の改行が "\n" 一文字であることを含意しているという主旨、
なので、あくまでC/C++のI/Oの挙動において\r\nと\r\r\nの変換が万国共通ならおk、

>ソースコードをコンパイルする前処理としての改行コードの正規化(?)の話
Windowsのメモ帳で
R"(begin
a)"
と書いたらソースファイル上は beginとaの間に CR LF が入るが文字列リテラルの期待値は "begin\na" ですよ(CR LF → LF 1文字に変換)、という話のはず……
774デフォルトの名無しさん (ワッチョイ 9756-RIfS)
垢版 |
2025/12/13(土) 10:53:09.54ID:+GybsC590
①エスケープシーケンス \n と ②そのデコード結果であるLF、③実際の改行コード(プラットフォームにより、LF、CRLF、CRのいずれか)の区別を意識的にしないと議論が混乱すると思う。
cpprefjpの>>761 の説明に違和感があるのは、raw文字列リテラル内ではエスケープシーケンスのデコード処理はされないのに、エスケープシーケンス \n で説明している点にもあると思う。773も同様に①と②を同義語として使っているように見えるが、そこは本来は区別すべきではないか。
775デフォルトの名無しさん (ワッチョイ 9756-RIfS)
垢版 |
2025/12/13(土) 10:59:50.95ID:+GybsC590
>>773の最後の例でいえば、raw文字列リテラルの仕様として、改行コードがLF(エスケープシーケンス \n ではない)に変換されるという記述は特にないと思う。
776デフォルトの名無しさん (ワッチョイ 9756-RIfS)
垢版 |
2025/12/13(土) 11:05:17.48ID:+GybsC590
実際には、最初にソースコード上の改行コードが一律にLFに変換され、トークン分割の段階でraw文字列リテラル中の改行コードと判明した場合には(>>763)、それに応じた処理をするんだろうが、LFからさらに変換したりはしないというのはありそうなことではある。
だけど、それは改行コードの正規化(?)に付随してそういう処理になっていることが多いというだけのことであって、raw文字列リテラルの仕様の一部としてそうすべきと規定されているわけではないよねってことだと思うんだが。
777デフォルトの名無しさん (ワッチョイ 9756-RIfS)
垢版 |
2025/12/13(土) 11:07:53.08ID:+GybsC590
NGワード規制回避のため分割レスになって申し訳ない。何がNGワードだったんどろう……、
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況