Avatar
omochimetaru 2/6/2025 12:04 AM
https://discord.com/channels/291054398077927425/430242233468452865/1336833815728885760 @shiz
// If we do not have an Ownership Repr and do not have a no escape type, // return implicit copyable consuming.
12:05 AM
これについては、オーナーシップ指定子がついてない時はconsuming扱い、という仕様に従ってるだけですね
12:07 AM
Swiftの引数はたとえCopyableだったとしても、consuming, shared, inoutの3つのどれかしかないです
12:08 AM
それで、Copyableな場合の通常の値渡しはconsumingです。 コピーが複製されて、呼び出し側と共有はされてないから、寿命がそのローカル関数に閉じてるからです。
t_naruhodo 1
12:08 AM
consumingというのはミスリーディングで初期はこれはownedと呼ばれてました
12:09 AM
引数とメソッドが nonmutatingとshared, mutatingとinout、consumingとownedという対応だったんだけど、同じものは同じワードの方がわかりやすいだろう、ということで引数もconsumingと呼びことに決まった
12:11 AM
c++ static bool isSpecifierImmutableInFunctionBody(Specifier sp) { switch (sp) { case Specifier::Default: case Specifier::Borrowing: case Specifier::LegacyShared: case Specifier::LegacyOwned: return true; case Specifier::Consuming: case Specifier::InOut: case Specifier::ImplicitlyCopyableConsuming: return false; } llvm_unreachable("unhandled specifier"); }
12:13 AM
素直に見るとこれが変ですよね、inoutな値はmutableだけど、consumingは別にインターフェースとしてはletなので。 でも、ここはlet/varのミュータビリティではなく、別のニュアンスの話なのかもしれない? (edited)
12:15 AM
c++ /// Does a var or subscript produce an l-value? /// /// \param baseType - the type of the base on which this object /// is being accessed; must be null if and only if this is not /// a type member static bool doesStorageProduceLValue( ... if (!baseType) { return true; } (edited)
12:20 AM
この関数は var が LValue を提供できるかどうかを調べてそうですね
12:23 AM
sendingだったからといって、代入左辺にもできないし & も付けられないので、やっぱり (たとえローレベルで間接アクセスできるとしても)Swiftの型システムレベルでLValue に評価されてるのがおかしい気がする