Rust: const fn远跡の問題RFC 911

䜜成日 2015幎04月06日  Â·  274コメント  Â·  ゜ヌス: rust-lang/rust

https://github.com/rust-lang/rust/issues/57563 | 新しいメタトラッキングの問題

叀いコンテンツ

rust-lang / rfcs911の远跡の問題。

この問題は、より的を絞った問題を優先しおクロヌズされたした。

  • 〜地元の人、割り圓お、砎壊rust-lang / rust48821〜
  • パタヌンずの統合 https //github.com/rust-lang/rust/issues/57240
  • フロヌティングポむント https //github.com/rust-lang/rust/issues/57241
  • パニック https //github.com/rust-lang/rust/issues/51999
  • ルヌプ https //github.com/rust-lang/rust/issues/52000
  • 制埡フロヌ https //github.com/rust-lang/rust/issues/49146
  • 生のポむンタヌの比范 https //github.com/rust-lang/rust/issues/53020
  • 生のポむンタヌの間接参照 https //github.com/rust-lang/rust/issues/51911
  • usizeキャストぞの生のポむンタヌ https //github.com/rust-lang/rust/issues/51910
  • ナニオンフィヌルドアクセス https //github.com/rust-lang/rust/issues/51909
  • 長期評䟡に関する譊告 https //github.com/rust-lang/rust/issues/49980
  • ゚ラヌを匕き起こさない定数䌝播 https //github.com/rust-lang/rust/issues/28238
  • &mut T参照ず借甚 https //github.com/rust-lang/rust/issues/57349

安定させる前にすべきこず

CTFE = https://en.wikipedia.org/wiki/Compile_time_function_execution

A-const-eval A-const-fn B-RFC-approved B-RFC-implemented B-unstable C-tracking-issue T-lang

最も参考になるコメント

私が完党にポむントから倖れおいる堎合は、これを無芖しおください。

このRFCで私が目にする問題は、ナヌザヌずしお、おそらくベストプラクティスになるため、できるだけ倚くの関数const fnをマヌクする必芁があるずいうこずです。 同じこずが珟圚、contexprを䜿甚するC++でも発生しおいたす。 これは䞍必芁な冗長性だず思いたす。

Dにはconst fnはありたせんが、コンパむル時に任意の関数を呌び出すこずができたす䞀郚の䟋倖を陀く。

䟋えば

// Standalone example.
struct Point { x: i32, y: i32 }

impl Point {
    fn new(x: i32, y: i32) -> Point {
        Point { x: x, y: y }
    }

    fn add(self, other: Point) -> Point {
        Point::new(self.x + other.x, self.y + other.y)
    }
}

const ORIGIN: Point = Point::new(0, 0); // works because 0, 0 are both known at compile time 
const ORIGIN2: Point = Point::new(0, 0); // ditto

const ANOTHER: Point = ORIGIN.add(ORIGIN2); // works because ORIGIN and ORIGIN2 are both const.
{
    let x: i32 = 42;
    let y: i32 = 24;
    const SOME_POINT: Point = Point::new(x, y); // Error: x and y are not known at compile time
}
{
    const x: i32 = 42;
    const y: i32 = 24;
    const SOME_POINT: Point = Point::new(x, y); // Works x and y are both known at compile time.
}

泚意しおください、私は実際にはRustナヌザヌではなく、数分前にRFCを読んだだけなので、䜕かを誀解した可胜性がありたす。

党おのコメント274件

これは25609で閉鎖されおいたすか

@Munksgaardこれは、コンパむラAFAIKにサポヌトを远加するだけです。 stdlibには、 const fnに倉曎しお、砎損をテストする必芁のある関数がたくさんありたす。 その進捗状況はわかりたせん。

これをstd::ptr::null()ずnull_mut()に実装しお、 0usize as *mut _に頌らずにstatic mut *MyTypeWithDropを初期化できるようにしたいず思っおいたす。

線集それが䞻題から倖れおいたので削陀されたした

明確にするために、ここでの質問は、䞻に機胜の有甚性に関するものではなく、それを定匏化するための最良の方法たたはそれを定匏化するための最良のフレヌムワヌクに関するものです。 RFCの説明を参照しおください。

これは珟圚、最終的な安定化の远跡の問題です。

https://github.com/rust-lang/rust/issues/29107は閉鎖されたした。

「パタヌンずの統合」、たたは暙準ラむブラリぞの倉曎がこれをブロックするこずに同意したせん。 これは、これらの倉曎がなくおも非垞に䟿利であり、これらの倉曎は埌で行うこずができたす。 特に、自分のコヌドでconst fnをすぐに䜿い始めたいず思いたす。

したがっお、これの安定化状態を再評䟡するこずができたすか

const fnは、珟圚の限定された圢匏でも䟿利な機胜になるこずは間違いありたせんが、理想的にはこの道を進む前に、「 const fnアプロヌチ」で、圌らの奜みの゚ンドゲヌムに぀いお考え、明確にしたす。 最も明癜な方法で有甚に芋える機胜を段階的に远加し続けるず、最終的にはC ++のconstexprデザむン党䜓を倚かれ少なかれコピヌしおしたう可胜性が非垞に高くなりたす。 それは私たちが快適なこずですか たずえそうだずしおも、抵抗が最も少なくなる道ずしお、時間の経過ずずもに小さな䞀歩を螏み出すのではなく、はっきりずした目でその道を遞ぶほうがずっずいいず思いたす。

安党なRustコヌドのセマンティクスは完党に定矩可胜である必芁があるこずを考えるず、最終的には少なくずも䞀時的に unsafeに䟝存しないすべおの関数をconstずしおマヌクできるようになるはずです。 unsafeが実装の詳现であるず想定されおいるこずを考えるず、人々はその制限をなんずか緩和するこずを匷く求めるでしょう。私はむしろ海倖を芋お、よりたずたりがあり、有胜で、ステヌゞングずタむプレベルの蚈算のための十分に統合されたストヌリヌ。

@glaebhoerl

const fnは、珟圚の限定された圢匏でも䟿利な機胜であるこずは間違いありたせんが、理想的にはこのパスに進む前に、「constfnアプロヌチ」を支持する人にずっお本圓に欲しいものです。圌らの奜みの゚ンドゲヌムに぀いお考え、明確に衚珟しおください...最終的にはC++のconstexprデザむン党䜓を倚かれ少なかれコピヌするこずになる可胜性が非垞に高いようです。

それ以䞊に、私が個人的に望んでいるのは、それをどのように実装するのか、そしお蚀語のどの郚分をカバヌするのかに぀いお、かなり明確な芋解を持っおいるずいうこずです。 ずは蚀うものの、これは私の頭の䞭では敎数に察する関連する定数やゞェネリックスのサポヌトず非垞に密接に関連しおいたす。

@eddybず私は最近、非垞に幅広いコヌドの範囲を垞に評䟡できるスキヌムに぀いおスケッチを行いたした。 基本的に、すべおの定数をMIRに䞋げお解釈したす堎合によっおは、
抜象通蚳、ただ評䟡できないゞェネリックがある堎合、それが私にずっお最も興味深いずころです。

ただし、「組み蟌み蚀語」の倧郚分をサポヌトするのはかなり簡単なように思えたすが、実際のコヌドは、メモリ割り圓おを非垞に迅速に行う必芁性にぶ぀かりたす。 ぀たり、 Vecたたはその他のコンテナを䜿甚する必芁がありたす。 そしお、それはこの通蚳スキヌム党䜓が私の心にもっず耇雑になり始めるずころです。

そうは蚀っおも、 @ glaebhoerl 、あなたがあなたの奜みの代替゚ンドゲヌムを明確に衚珟するのを聞いおみたいです。 const fn RFCでそのような考えをスケッチしたず思いたすが、この文脈でもう䞀床聞いおみるずよいず思いたす。 :)

割り圓おの問題は、実行時に゚スケヌプするこずです。
どういうわけか、そのコンパむル時/実行時の障壁を越えるこずを犁止できれば、 const fnでliballocが機胜する可胜性があるず思いたす。
解釈されたスタック䞊のバ​​むトアドレス可胜な倀を凊理するよりも、これらの皮類の割り圓おを管理するこずは難しくありたせん。

たたは、バリアを通過する必芁があるたびに倀を割り圓おお入力するランタむムコヌドを生成するこずもできたすが、どのようなナヌスケヌスがあるかはわかりたせん。

本栌的なconstexprのような評䟡でも、 const fnは玔粋であるこずに泚意しおください。 'staticデヌタで2回実行するず、たったく同じ結果になり、副䜜甚。

@nikomatsakisもし私が持っおいたら、それに぀いお蚀及したでしょう。 :)私は䞻に既知の未知数を芋るだけです。 ゞェネリックシステムの䞀郚ずしおconstを䜿甚するこずは、もちろん、C++蚭蚈であるず私が理解したこずの䞀郚でした。 constずconstのゞェネリックパラメヌタヌを関連付けおいる限り、タむプの䞀郚ずしおconstを含む固定サむズの配列がすでにあり、抜象化したいず考えおいたす。それらの堎合、単に䞀般的な方法ではなく、はるかに優れた方法があったずしたら、私は驚きたす。 物事のconst fnの郚分は、より分離可胜で倉化しやすいず感じたす。 物事をさらに進めお、ゞェネリックスにconst implやconst Traitの境界があるこずを想像するのは簡単ですが、私は、すでに物事を理解しおいるこの皮の䞀般的なものの先行技術があるず確信しおいたす。そしおそれを芋぀けようずするべきです。

Rust蚀語の䞻なナヌスケヌスのうち、カヌネルのように䞻に䜎レベルの制埡を必芁ずするものは、すでに十分に機胜しおいるように芋えたすが、Rustが倚くの可胜性を秘めおいる可胜性がある別の領域は、䞻に高性胜を必芁ずするものです。段階的蚈算 const fnはすでに非垞に限定されたむンスタンスですに察する䜕らかの圢でのスペヌスの匷力なサポヌトは、ゲヌムチェンゞャヌになる可胜性があるようです。 ここ数週間で、Rustからより優れたステヌゞング機胜を備えた蚀語に切り替えるこずを決定した人々による2぀の別々のツむヌトに出くわしたした。蚀語の既存の゜リュヌションのいずれかが「私たちに近い」かどうかはわかりたせん- C ++のconstexpr 、DのアドホックCTFE、手続き型マクロ-この皮のこずに察しお、本圓に刺激的で匷力/完党であるず感じたす。 手続き型マクロは持っおいるのは良いこずのように思えたすが、抜象化ずDSLにはもっず倚く、パフォヌマンス指向のコヌド生成にはそれほど倚くありたせん。

䜕が刺激的で十分に良いかに぀いおは...私はただそれを芋おいたせん、そしお私は正確にどこを芋るべきかを知るために空間党䜓に十分に粟通しおいたせん。 もちろん、䞊蚘のずおり、倚くの点でRustずはたったく異なる蚀語のように芋えおも、少なくずもJuliaずTerraを䞀瞥したいず思うかもしれたせん。 オレグ・キセリョフがこの分野で倚くの興味深い仕事をしおきたこずを私は知っおいたす。 TiarkRompfのScala甚のLancetおよびLightweightModularStagingに関する䜜業は間違いなく䞀芋の䟡倀があるようです。 䟝存型のRustがどのように芋えるかに぀いおの@kmcallisterによるプレれンテヌションを芋たこずを思い出したす少なくずもどこにでもconstを貌り付けるよりも䞀般的かもしれたせん。たた、Olegから効果たで䜕かを芋たこずを思い出したす。その型自䜓はステヌゞングの圢匏ですコンパむルずランタむムの間の盞分離がステヌゞに非垞に䌌おいるこずを考えるず自然に感じたす...倚くの異なる方向での倚くの゚キサむティングな朜圚的な接続、それが芋逃されたように感じる理由です私たちが思い぀いた最初の解決策にただコミットするなら、チャンスです。 :)

これは単なるブレむンダンプであり、私はほが確実に倚くのこずを䞍完党に特城付けおいたす。

ただし、「組み蟌み蚀語」の倧郚分をサポヌトするのはかなり簡単なように思えたすが、実際のコヌドは、メモリ割り圓おを非垞に迅速に行う必芁性にぶ぀かりたす。 ぀たり、Vecたたはその他のコンテナを䜿甚する必芁がありたす。 そしお、それはこの通蚳スキヌム党䜓が私の心にもっず耇雑になり始めるずころです。

私は、「実際の実際のコヌド」の特城づけに同意したせん。 Rustは、ヒヌプメモリの割り圓おの必芁性を枛らすのに圹立぀ため、倧きな関心があるず思いたす。 特に私のコヌドは、可胜な限りヒヌプの割り圓おを回避するために具䜓的な努力をしおいたす。

それ以䞊のこずができるのは_玠晎らしい_ですが、コンパむラヌによっお匷制された䞍倉条件を䜿甚しお、自明でない型の静的むンスタンスを構築できるこずが䞍可欠です。 C ++ constexprのアプロヌチは非垞に制限されおいたすが、ナヌスケヌスに必芁なものを超えおいたす。パラメヌタヌxを䜿甚しおタむプTのむンスタンスを構築できる関数を提䟛する必芁がありたす。 x 、 y 、およびzで、関数はx 、 y 、およびzが有効であるこずを保蚌したす䟋 x < y && z > 0 、起動時に実行される初期化コヌドを䜿甚せずに、結果がstatic倉数になるようにしたす。

@briansmith FWIW同じナヌスケヌスを解決する可胜性のある別のアプロヌチは、マクロにプラむバシヌの衛生状態がある堎合です。これは、マクロにプラむバシヌの衛生状態を持たせるこずを蚈画しおいるず思いたす。

@briansmith FWIW同じナヌスケヌスを解決する可胜性のある別のアプロヌチは、マクロにプラむバシヌの衛生状態がある堎合です。これは、私たちがマクロに持たせるこずを蚈画しおいるず私は信じおいたす。

手続き型マクロを䜿甚するず、コンパむル時にx < y && z > 0を評䟡できるず思いたす。 しかし、手続き型マクロが安定したRustで䜿甚できるようになるたでには、䜕ヶ月もかかるようです。 const fnは、物事の状態を理解しおいる限り、安定したRust_now_を有効にできるので興味深いものです。

@glaebhoerl厳密な衛生状態のために息を止めたせん。実際のLISPのように゚スケヌプメカニズムを䜿甚する可胜性は十分にあるので、安党䞊の目的で䜿甚したくない堎合がありたす。

@glaebhoerlにはhttps://anydsl.github.io/もありたす。
さびのような構文;基本的に段階的な蚈算を察象ずしおいたす
特定の郚分評䟡。

2016幎1月16日土曜日午埌6時29分、Eduard-Mihai Burtescu <
[email protected]>は次のように曞いおいたす

@glaebhoerlhttps ://github.com/glaebhoerl息を止めない
厳栌な衛生状態、脱出メカニズムを備えおいる可胜性は十分にありたす
実際のLISPず同じように、安党のためにそれを望たないかもしれたせん
目的。

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/rust-lang/rust/issues/24111#issuecomment-172271960 。

29525は安定化する前に修正する必芁がありたす

安党なRustコヌドのセマンティクスは完党に定矩可胜である必芁があるこずを考えるず、最終的には少なくずも䞀時的に unsafeに䟝存しないすべおの関数をconstずしおマヌクできるようになるはずです。 。 そしお、 unsafeが実装の詳现であるず想定されおいるこずを考えるず、人々はその制限をなんずかしお緩めるこずを匷く求めるでしょう。

考えおみおください。Rustのメモリモデルを正匏に定矩した堎合、 unsafeコヌドでさえ、抜象的/蚘号的に解釈するこずで、コンパむル時に安党か぀賢明に評䟡できる可胜性がありたす。぀たり、生のポむンタを䜿甚するこずはできたせん。 t実行時のように盎接メモリアクセスに倉わりたすが、割り圓おられたアドレスのハッシュマップをタむプや倀などずずもにルックアップし、すべおのステップで有効性をチェックするようなものになりたす。動䜜が定矩されおいない実行は、 rustcのセキュリティの脆匱性ではなく、コンパむラによっお報告された゚ラヌになりたす。 これは、コンパむル時にisizeずusizeをシンボリックに、たたはプラットフォヌムに䟝存しお凊理する状況にも関連しおいる可胜性がありたす。

const fnに関しお、それがどこにあるのかわかりたせん。 䞀方では、コンパむル時に利甚できるはるかに䟿利なコヌドが開かれる可胜性がありたす- Box 、 Vec 、 Rc 、 unsafeを䜿甚するものパフォヌマンスの最適化のためのconst fnになる可胜性があるもの」の境界は、基本的に_FFIを含たないもの_に倖偎に移動したす。 したがっお、 constを装っお、型システムで_実際に_远跡するのは、FFIに掚移的に䟝存するものず䟝存しないものです。 そしお、䜕かがFFIを䜿甚するかどうかは、人々が正圓に内郚実装の詳现であるず考えるものであり、この制限 unsafeずは異なりは_実際に_解陀するのは珟実的ではないようです。 そしお、このシナリオでは、おそらく、そうでないものよりもはるかに倚くのfnがconstの察象になりたす。

したがっお、 constは、実装を公開する任意の制限を䞭心に展開するこずになり、ほずんどすべおの堎所にconstを曞き蟌む必芁がありたす。 それも魅力的に聞こえたせん...

぀たり、生のポむンタを䜿甚するず、実行時のように盎接メモリアクセスに倉わるのではなく、割り圓おられたアドレスのハッシュマップを怜玢するようなものになりたす。

@glaebhoerlええず、それは私が説明したモデルであり、 @tsionのmiriが実装しおいるモデルです。

FFIの区別は、䞀貫性のために_必須_である玔床のために非垞に重芁だず思いたす。
unsafePerformIOがあるため、Rust const fnにGHCを䜿甚するこずさえできたせんでした。

私はconstキヌワヌドがあたり奜きではないので、 const fn foo<T: const Trait> const fn foo<T: Trait>で倧䞈倫です const impl Trait for Tが必芁な堎合。

Sizedず同じように、デフォルトが間違っおいる可胜性がありたすが、珟実的に機胜する他の提案は芋たこずがありたせん。

@eddyb https://internals.rust-lang.org/t/mir-constant-evaluation/3143/3111ではなくコメント31にリンクする぀もりだったず思いたす。

@tsion修正枈み、ありがずう

私が完党にポむントから倖れおいる堎合は、これを無芖しおください。

このRFCで私が目にする問題は、ナヌザヌずしお、おそらくベストプラクティスになるため、できるだけ倚くの関数const fnをマヌクする必芁があるずいうこずです。 同じこずが珟圚、contexprを䜿甚するC++でも発生しおいたす。 これは䞍必芁な冗長性だず思いたす。

Dにはconst fnはありたせんが、コンパむル時に任意の関数を呌び出すこずができたす䞀郚の䟋倖を陀く。

䟋えば

// Standalone example.
struct Point { x: i32, y: i32 }

impl Point {
    fn new(x: i32, y: i32) -> Point {
        Point { x: x, y: y }
    }

    fn add(self, other: Point) -> Point {
        Point::new(self.x + other.x, self.y + other.y)
    }
}

const ORIGIN: Point = Point::new(0, 0); // works because 0, 0 are both known at compile time 
const ORIGIN2: Point = Point::new(0, 0); // ditto

const ANOTHER: Point = ORIGIN.add(ORIGIN2); // works because ORIGIN and ORIGIN2 are both const.
{
    let x: i32 = 42;
    let y: i32 = 24;
    const SOME_POINT: Point = Point::new(x, y); // Error: x and y are not known at compile time
}
{
    const x: i32 = 42;
    const y: i32 = 24;
    const SOME_POINT: Point = Point::new(x, y); // Works x and y are both known at compile time.
}

泚意しおください、私は実際にはRustナヌザヌではなく、数分前にRFCを読んだだけなので、䜕かを誀解した可胜性がありたす。

@MaikKleinはRFCの議論でCTFEに぀いお倚くの議論がありたした

ここでブロッカヌを説明する最近のコメントは芋圓たりたせんし、操䜜はあたり明るくありたせん。 ステヌタスはどうですか。 これをフィニッシュラむンを越えお移動するにはどうすればよいですか

これはRocketによっお䜿甚されたす https //github.com/SergioBenitez/Rocket/issues/19#issuecomment -269052006

https://github.com/rust-lang/rust/issues/29646#issuecomment-271759986を参照しおください。 たた、miriは「グロヌバルな副䜜甚」に限界を抌し広げおいるため、明瀺性に関する立堎を再考する必芁がありたす @solsonず@nikomatsakisはIRCでこれに぀いお話しおいたした。

このRFCで私が目にする問題は、ナヌザヌずしお、おそらくベストプラクティスになるため、できるだけ倚くの関数constfnをマヌクする必芁があるずいうこずです。

任意の関数を呌び出し可胜にするこずはできたすが、それらの関数がCコヌドたたは静的関数にアクセスする堎合、それらを蚈算するこずはできたせん。 解決策ずしお、constfnである可胜性のあるパブリック関数に぀いお譊告するlintを提案したす。

私はリントに぀いお同意したす。 これは、既存の組み蟌みのlint missing_docs 、 missing_debug_implementations 、およびmissing_copy_implementationsに䌌おいたす。

ただし、デフォルトでlintをオンにするず、ある皮の問題が発生したす。たずえば、埌で関数を次のように倉曎する予定があるため、明瀺的にconstにしたくない関数に぀いお譊告したす。 constにするこずはできず、むンタヌフェむスをconstにコミットしたくありたせん constを削陀するこずは重倧な倉曎です。

#[allow(missing_const)] fn foo() {}はそのような堎合に機胜するず思いたすか

@eddyb @nikomatsakis私の「 constの削陀は重倧な倉曎です」ずいう点は、 fnがconstのたたになるこずが䞋流ぞの玄束であるため、結局のずころキヌワヌドが必芁であるこずを瀺唆しおいたす。次のメゞャヌバヌゞョンたで

constをstdや他のラむブラリに振りかける必芁があるのは残念ですが、公共の堎でのみ必芁ずされない限り、どうすればそれを回避できるかわかりたせん-盎面しおいるアむテム、そしおそれは玛らわしいルヌルのようです。

公開されおいるアむテムにのみ必芁であり、それが玛らわしいルヌルのように思われる堎合を陀きたす。

私はこれが奜きです...私はそれが混乱するこずはないず思いたす。 const fnによっお呌び出される関数を非定数にするこずはできないため、パブリックむンタヌフェむスは保護されおいたす。

技術的には、関数にnotconstずしお泚釈を付ける方がよいでしょう。これは、他の方法よりもはるかに倚くのconst fnがあるず予想されるためです。

notconstは、Rustの蚭蚈哲孊ずもより䞀貫性がありたす。 ぀たり、「 mut const 」

公開されおいるアむテムにのみ必芁であり、それが玛らわしいルヌルのように思われる堎合を陀きたす。

私はこれが奜きです...私はそれが混乱するこずはないず思いたす。

私はこのアむデアをフリップフロップしおいたす。 これには利点がありたすパブリックむンタヌフェむスの決定を行うずきconst fnに぀いおのみ考えおくださいが、混乱を招く可胜性のある別の方法を考えたした。

const fnによっお呌び出される関数not-constを䜜成できないため、パブリックむンタヌフェむスは保護されたす。

これは真実であり、残念ながら、ラむブラリの䜜成者がパブリック関数const constマヌクするず、その関数によっお掚移的に呌び出されるすべおの関数も暗黙的にマヌクされるこずを意味したす。意図せずに䞍芁な関数にマヌクを付けおいるため、将来、非定数機胜を䜿甚しおこれらの内郚関数を曞き盎すこずはできたせん。


他の方法よりもはるかに倚くのconst fnがあるず思いたす。

私はしばらくの間このように考えたしたが、それは玔粋なRustラむブラリの朚枠にのみ圓おはたりたす。 FFIベヌスのfnsをconstにするこずはできたせん掚移的にFFIベヌスである堎合でも、倚くのものがありたす。したがっお、 const fnの金額はそれほど悪くない可胜性がありたす。あなたず私が思ったように。


私の珟圚の結論明瀺的でないconst fnは問題があるようです。 キヌワヌドをたくさん曞くのを避ける良い方法はないかもしれたせん。

たた、蚘録ずしお、 notconstは重倧な倉曎になりたす。

@solson非垞に良い点です。

特性メ゜ッドで䜿甚しようずするず、キヌワヌドがさらに毛むくじゃらになるこずに泚意しおください。 トレむト定矩に制限するこずは十分に有甚ではなく、implsに泚釈を付けるず、䞍完党な「constfnparametrim」ルヌルになりたす。

そもそもconst fnを採甚したずき、このトレヌドオフはかなり培底的に議論されたように感じたす。 @solsonの分析も正しいず思いたす。 倉曎されたのは、おそらく巡査fnsの割合が倧きくなったずいうこずだけだず思いたすが、ここでの基本的なトレヌドオフを倉曎するのに十分ではないず思いたす。 パブリックむンタヌフェむスなどにconst fnを埐々に远加しなければならないのは面倒ですが、それは人生です。

@nikomatsakis私を悩たせおいるのは、これら2぀の事実の組み合わせです。

  • 事前にすべおをチェックするこずはできたせんunsafeコヌドは「動的に非定数」である可胜性がありたす
  • ゞェネリックスずトレむトの実装に察しお䜕をするにしおも、それは「正しい」ず柔軟なものの間のトレヌドオフになるでしょう。

「グロヌバルな副䜜甚」がコヌドがconst fnになるのを劚げる䞻なものであるこずを考えるず、これはRustが持っおいお削陀された「゚フェクトシステム」ではないでしょうか。
「効果の安定性」に぀いお話すべきではありたせんか 䞀郚のラむブラリがIMOをパニックに陥らないこずを前提ずしたコヌドに䌌おいるようです。

@eddybは絶察constぱフェクトシステムであり、そうです、それは私たちがそれらをできるだけ避けたいず思ったすべおの欠点を䌎いたす...私たちが远加の苊痛に耐える぀もりならそれはもっずもらしいです゚フェクトシステムでは、他の皮類の゚フェクトにスケヌリングできる構文を怜蚎するこずをお勧めしたす。 䟋ずしお、 unsafe これも効果で同様の䟡栌を支払っおいたすが、それらを統合するこずを考えるのが理にかなっおいるずは思えたせん。

違反が動的に発生する可胜性があるずいう事実は、このオプトむンを行うさらに倚くの理由のように思えたすが、そうではありたせんか

これはどう

䞀般に、 const fnは、コンストラクタヌ new たたは絶察に必芁な堎合にのみ䜿甚する必芁があるず思いたす。

ただし、定数を簡単に䜜成するために、他の方法を䜿甚したい堎合がありたす。 constnessをデフォルトにするこずで、倚くの堎合、この問題を解決できるず思いたすが、定矩モゞュヌルに察しおのみです。 このように、すべおをconstにするこずなく関数で定数を䜜成する䟿利さを持ちながら、 constで明瀺的に保蚌されない限り、扶逊家族はconstnessを想定できたせん。

@torkleyy゚クスポヌトされおいないヘルパヌを䜿甚するこずで、すでにそれを行うこずができたす。

可胜であれば、プラむベヌトヘルパヌ関数を暗黙的にconstにすべきではないずいう匷い議論は芋圓たりたせん。 @solsonは、ヘルパヌ関数であっおもconstを明瀺的にするず、プログラマヌは䞀時停止しお、その関数がconstであるこずにコミットするかどうかを怜蚎するように匷制されるず蚀っおいたず思いたす。 しかし、プログラマヌがすでにパブリック関数に぀いおそれに぀いお考える必芁がある堎合、それで十分ではありたせんか どこにでもconstを曞く必芁がないのは䟡倀がありたせんか

IRCで、@ eddybは、この機胜ゲヌトを分割するこずを提案したした。これにより、const fnsぞの呌び出しを安定させおから、宣蚀ず本文の詳现を把握するこずができたす。 それは良い考えのように聞こえたすか

@durkaコンパむラの内郚に぀いおあたり知らないRustナヌザヌずしお、それは私には玠晎らしいこずだず思いたす。

ここで理解が䞍足しおいるこずをお詫びしたすが、宣蚀を安定させるこずなくconst関数の呌び出しを安定させるずはどういう意味ですか。

コンパむラヌは䜕らかの方法で䞀定であるかどうかを䜕らかの方法で認識したすが、圓面はその郚分を議論/実装のために開いたたたにしおおくず蚀っおいたすか

では、コンパむラヌが埌で䜕が䞀定であるかに぀いお考えを倉える可胜性がある堎合、どのようにしお呌び出しを安定させるこずができたすか

@nixpulvisいく぀かのconst fnは、暙準ラむブラリにすでに存圚したす䟋 UnsafeCell::new 。 この提案により、たずえばstaticアむテムの初期化子など、䞀定のコンテキストでそのような関数を呌び出すこずができるようになりたす。

@nixpulvis私が意味したのは、安定したRustコヌドで定矩された通垞の関数ではなく、定数コンテキストからの䞍安定な䜿甚コヌド暙準ラむブラリなどによっお定矩されたconst fn関数の呌び出しでした。

const fnぞの呌び出しを安定させるこずに賛成ですが、それがより速く発生する可胜性がある堎合は、すべおのconst fn機胜の安定化をブロックしおいる理由がわかりたせん。 今日残っおいる懞念は䜕ですか それらに察凊するための道は䜕でしょうか

@SimonSapinそれ以䞊に、今日のconst fnを宣蚀するための蚭蚈が明確ではなく、それらず特性の間の盞互䜜甚、およびどの皋床の柔軟性が必芁かに぀いおも確信がありたせん。

constfnの䜿甚を安定させたいず思いたす。 これは人間工孊的で衚珟力豊かな勝利のように思えたすが、「通垞のコヌドを曞く」こずができるよりも、コンパむル時定数の評䟡を凊理するためのより良い方法を想像するこずはできたせん。

constfnの䜿甚を安定させたす。

これにより、暙準ラむブラリの䞀郚の関数がconstずしお安定したす。ラむブラリチヌムは、少なくずもいく぀かの監査を行う必芁がありたす。

@petrochenkovごずに監査される関数のリストずずもに、呌び出しを安定させるためにPRhttps: //github.com/rust-lang/rust/issues/43017を提出したした。

特定の特性/implの状況でこれをどのように䜿甚できるかに぀いお質問/コメントがありたす。 仮に、 Zeroの特性を持぀数孊ラむブラリがあるずしたしょう。

pub trait Zero {
    fn zero () -> Self;
}

この特性では、 zeroメ゜ッドがconstである必芁はありたせん。これにより、 Vec BigIntタむプによっお暗瀺されるのを防ぐこずができたす。 ただし、マシンスカラヌやその他の単玔な型の堎合、メ゜ッドがconstあれば、はるかに実甚的です。

impl Zero for i32 {
    const fn zero () -> i32 { 0 } // const
}

impl Zero for BigInt {
    fn zero () -> BigInt { ... } // not const
}

この特性では、メ゜ッドがconstである必芁はありたせんが、 constは実装に制限を远加し、それを無芖しないため、蚱可する必芁がありたす。 これにより、䞀郚のタむプで同じ関数の通垞バヌゞョンずconstバヌゞョンが䜿甚できなくなりたす。 私が疑問に思っおいるのは、これはすでに察凊されおいるずいうこずですか

トレむトの異なる実装が異なる動䜜をするようにしたいのはなぜですか これを䞀般的なコンテキストで䜿甚するこずはできたせん。 const fnを䜿甚しお、スカラヌにロヌカルimplを䜜成できたす。

@Daggerbotこれが、トレむトでconst fnを予枬する唯䞀の方法です。トレむトで、すべおのimplがconst fnである必芁がある堎合は、効果的に「 const impl s」を䜿甚するよりもはるかに䞀般的ではありたせん。 。

@jethrogb可胜ですが、constnessがimplのプロパティである必芁がありたす。
私が念頭に眮いおいるのは、たずえばT: Zeroがバむンドされた䞀般的なconst fnには、 Tに察しおZeroのimplが必芁になるずいうこずです。 T s呌び出しが定数コンテキスト自䜓から行われる堎合たずえば、別のconst fn 、 const fnメ゜ッドのみを含むように呌び出されたす。

完璧ではありたせんが、優れた代替案は提案されおいたせん。それに最も近いIMOは、「コンパむル時に䞍可胜なこずが詊行された堎合に、呌び出しスタックから深い呌び出しず゚ラヌを蚱可する」こずです。これはそれほど悪くはありたせん。第䞀印象に芋えるかもしれたせん-それに関する懞念のほずんどは䞋䜍互換性に関係しおいたす。぀たり、関数const fnをマヌクするず、事実が蚘録され、コンパむル時に無効な操䜜を実行するには、それを行わないようにする必芁がありたす。 const fn 。

これで問題は解決したせんか

pub trait Zero {
    fn zero() -> Self;
}

pub trait ConstZero: Zero {
    const fn zero() -> Self;
}

impl<T: ConstZero> Zero for T {
    fn zero() -> Self {
        <Self as ConstZero>::zero()
    }
}

ボむラヌプレヌトはマクロで枛らすこずができたす。

ほが同じこずを行う2぀の別個の特性 ZeroずConstZero を持぀ずいう小さな䞍䟿さは別ずしお、包括的実装を䜿甚する堎合に1぀の朜圚的な問題がありたす。

// Blanket impl
impl<T: ConstZero> Zero for T {
    fn zero () -> Self { T::const_zero() }
}

pub struct Vector2<T> {
    pub x: T,
    pub y: T,
}

impl<T: ConstZero> ConstZero for Vector2<T> {
    const fn const_zero () -> Vector2<T> {
        Vector2 { x: T::const_zero(), y: T::const_zero() }
    }
}

// Error: This now conflicts with the blanket impl above because Vector2<T> implements ConstZero and therefore Zero.
impl<T: Zero> Zero for Vector2<T> {
    fn zero () -> Vector2<T> {
        Vector2 { x: T::zero(), y: T::zero() }
    }
}

ブランケットimplを削陀するず、゚ラヌはなくなりたす。 党䜓ずしお、これは蚀語の耇雑さを最小限に抑えるため、コンパむラヌに実装するのがおそらく最も簡単です。

しかし、必芁のない実装枈みメ゜ッドにconstを远加できれば、完党ではありたせんが、この重耇を回避できたす。

impl<T: Zero> Zero for Vector2<T> {
    const fn zero () -> Vector2<T> {
        Vector2 { x: T::zero(), y: T::zero() }
    }
}

IIRC、C ++では、 constexprを操䜜するずきにこのようなこずができたす。 ここでの欠点は、このconstは、 <T as Zero>::zeroもconstである堎合にのみ適甚されるこずです。 これぱラヌである必芁がありたすか、それずもコンパむラが適甚できない堎合C ++などにこのconstを無芖する必芁がありたすか

これらの䟋はどちらも問題に完党に察凊しおいるわけではありたせんが、これ以䞊の方法は考えられたせん。

線集 @anderskの提案により、最初の䟋が゚ラヌなしで可胜になりたす。 これは、コンパむラの実装に関する限り、おそらく最良/最も単玔な゜リュヌションです。

@Daggerbotこれは、 RFC 1210特殊化の終わり近くに提案された「lattice」ルヌルのナヌスケヌスのように聞こえたす。 あなたが曞くなら

impl<T: ConstZero> Zero for T {
}  // 1
impl<T: ConstZero> ConstZero for Vector2<T> {
}  // 2
impl<T: Zero> Zero for Vector2<T> {
}  // 3
impl<T: ConstZero> Zero for Vector2<T> {
}  // 4

その堎合、1は3ずオヌバヌラップしたすが、それらの亀点は4で正確にカバヌされるため、ラティスルヌルで蚱可されたす。

http://smallcultfollowing.com/babysteps/blog/2016/09/24/intersection-impls/も参照しおください。

これは非垞に耇雑なシステムであり、避けたいものです。

ええ、ラティスルヌルが必芁になりたす。

@eddyb䜕が耇雑だず思いたすか

@Kixunil implをconst fnずしお「単に」マヌクする代わりに、暙準ラむブラリ内のほがすべおの特性を耇補したす。

ここで軌道に乗っおいたせん。 珟圚の問題は、 const fnの䜿甚を安定させるこずです。 const fn特性メ゜ッドたたはconst impl Trait for Fooを蚱可するこずは、互いに盎亀し、受け入れられたRFCに盎亀したす。

@ oli-obkこれは新しいRFCではなく、 const fnの远跡の問題です。

気づいたばかりで、コメントを線集したした。

@eddybええ、でもコンパむラヌの方が簡単で特殊化はありたせんが、ずにかく特殊化が必芁になるでしょう、 ConstTraitでバむンドするこずもできたす。

ずにかく、私はimplsをconstずしおマヌクするこずに反察しおいたせん。 コンパむラがConstTrait: Traitを自動生成するこずも想像しおいたす。

@Kixunil特に専門分野でそれを行うこずができる堎合、それはそれほど単玔ではありたせん。
コンパむラはConstTrait: Traitのようなものを自動生成する必芁はなく、トレむトシステムはこれに぀いお知る必芁はなく、実装具䜓的なimplのいずれかを繰り返す必芁がありたす。たたは、トレむトシステムが提䟛するwhereバりンドをチェックしたす。

const fnsがUnsafeCellぞのアクセスを犁止する必芁があるかどうか疑問に思っおいたす。 おそらく、真にconstの動䜜を蚱可する必芁がありたす。

const fn dont_change_anything(&self) -> bool {
    let old = self.cell.get();
    self.cell.set(!old);
    old
}

これたでのずころ、 setはconst $ではないこずを確認したした。 問題は、これが氞遠に続くかどうかです。 蚀い換えるず、 unsafeコヌドは、䞍倉デヌタに察しお同じconst関数を実行するず、今日および蚀語/ラむブラリの将来のすべおのリリヌスで垞に同じ結果が返されるこずを信頌できたすか

const fnは䞍倉を意味するのではなく、コンパむル時に呌び出すこずができるこずを意味したす。

分かりたした。 どういうわけか可胜であれば、 unsafeトレむトを䜿甚せずに、関数が耇数回呌び出されたずきに垞に同じものを返すこずをどうにかしお保蚌できれば幞いです。

必芁な@Kixunilhttps ://github.com/rust-lang/rfcs/issues/1631

@jethrogbリンクをありがずう

mem::size_ofが毎晩const fnずしお実装されおいるこずに気づきたした。 これはmem::transmuteなどで可胜でしょうか Rust組み蟌み関数はコンパむラヌの内郚で動䜜したすが、これを可胜にするための適切な倉曎を行うのに十分な知識がありたせん。 それ以倖の堎合は、実装させおいただきたす。

残念ながら、倀を操䜜するこずは、魔法のように倀を䜜成するよりも少し難しいです。 transmuteにはmiriが必芁です。 miriをコンパむラヌに組み蟌むための最初のステップはすでに進行䞭です43628

それで *Cell::new 、 mem::{size,align}_of 、 ptr::null{,_mut} 、 Atomic*::new 、 Once::new 、 {integer}::{min,max}_valueの定数安定化に関心がありたすか ここにFCPを含めるか、個別の远跡問題を䜜成したすか

はい。

私はこれに぀いお決定力を持っおいるチヌムの䞀員ではありたせんが、私の個人的な意芋では、 mem::{size,align}_ofを陀くこれらはすべお、ゎム印の動きを経るこずなく安定させるこずができるほど些现なこずです。 FCP。

ナヌザヌずしお、私はできるだけ早くconst匏でmem::{size,align}_ofを䜿甚したいのですが、 @ nikomatsakisが、 const fnにされたずきにそれらが䞍安定であるこずに懞念を衚明しおいるこずを読みたした。 。 特定の懞念があるのか​​、それずも䞀般的な泚意があるのか​​はわかりたせんが、IIRCが、機胜ごずの機胜ゲヌトが远加された理由です。 これら2぀の懞念は、FCPを共有できるほど類䌌しおいるず思いたす。 @rustbotが同じGitHubスレッドで別々のFCPを凊理できるかどうかはわかりたせん。そのため、別々の問題を開く方がおそらく良いでしょう。

@durkaこれらすべおの機胜の安定性を安定させるために、単䞀の远跡問題を開くこずができたすか 立ち䞊がったらFCPを提案したす。

alloc ::Layoutのconstfnsに関するディスカッションの先頭に立぀には
const fnでパニックを蚱容し、コンパむル゚ラヌずしお扱うこずはできたすか これは、定数の算術匏で珟圚行われおいるこずず䌌おいたすね。

はい、ミリがマヌゞされるず、それは非垞に些现な機胜です

これは、远加のstd関数がconstになるように芁求するのに適切な堎所ですか もしそうなら、 Duration:: { new 、 from_secs 、 from_millis }はすべお安党にconstを䜜るこずができたす。

@remexreそれを実珟する最も簡単な方法は、おそらくPRを䜜成し、そこでlibsチヌムのレビュヌを䟝頌するこずです。

https://github.com/rust-lang/rust/pull/47300ずしおPRしたす。 たた、䞍安定なコンストラクタヌにconstを远加したした。

さらにstd関数をconstずしお宣蚀できるようにするこずに぀いお䜕か考えはありたすか 具䜓的には、 mem::uninitializedずmem::zeroed  これらは䞡方ずも、远加のconst関数の適切な候補であるず思いたす。 私が考えるこずができる唯䞀の欠点は、 mem::uninitializedの同じ欠点です。ここでは、 Dropを実装する構造䜓の䜜成が䜜成され、 ptr::writeなしで䞊曞きされたす。

よろしければPRも付けられたす。

その動機は䜕ですか 無効なビットパタヌンを䜜成しお䞊曞きできないようにするのは圹に立たないフットガンのようですがconstにあるため、おそらく私は明らかなこずを芋萜ずしおいたす。

mem::uninitializedは絶察にフットガンであり、䞍適切に狙われた堎合にもあなたの手を通しお撃ちたす。 真剣に、 unsafeずマヌクされおいるにもかかわらず、この関数の䜿甚がどれほど危険であるかを誇匵するこずはできたせん。

これらの远加関数constを宣蚀する動機は、これらの関数の性質に由来したす。 mem::uninitialized<Vec<u32>>を呌び出すず、副䜜甚なしに毎回同じ結果が返されるためです。 明らかに、初期化されおいない堎合、これはひどいこずです。 したがっお、 unsafeはただ存圚しおいたす。

しかし、ナヌスケヌスずしお、ある関数の開始を远跡するグロヌバルタむマヌを考えおみたしょう。 内郚状態は埌で決定されたすが、実行時に䜜成された静的グロヌバル構造䜓ずしお提瀺する方法が必芁です。

use std::time::Instant;

pub struct GlobalTimer {
    time: UnsafeCell<Instant>
}

impl TimeManager {
    pub const fn init() -> TimeManager {
        TimeManager {
            time: UnsafeCell::new(Instant::now())
        }
    }
}

Instant::now()がconst関数ではないため、このコヌドはコンパむルされたせん。 Instant::now()をmem::uninitialized::<Instant>())に眮き換えるず、 mem::uninitializedがconst fnの堎合、この問題が修正されたす。 理想的には、プログラムが実行を開始するず、開発者はこの構造を初期化したす。 このコヌドは非慣甚的な錆ず芋なされたすがグロヌバルな状態は䞀般的に非垞に悪いです、これはグロヌバルな静的構造が圹立぀倚くのケヌスの1぀にすぎたせん。

この投皿は、コンパむル時に実行されるRustコヌドの将来の良い基盀になるず思いたす。 グロヌバルなコンパむル時の静的構造は、錆が珟圚欠萜しおいるいく぀かの重芁なナヌスケヌスOSも思い浮かびたすを備えた機胜です。 unsafeのマヌキングにもかかわらず、$ mem::uninitializedやmem::zeroedなどの適切ず思われるラむブラリ関数にconstをゆっくりず远加するこずで、この目暙に向けお小さな䞀歩を螏み出すこずができたす。

線集 TimeManager::init() constを忘れたした

うヌん、そのコヌドはコンパむルされるので、私はただここで正確な動機を逃しおいたす...あなたが次のようなコヌドを曞くこずができれば

const fn foo() -> Whatever {
    unsafe { 
        let mut it = mem::uninitialized();
        init_whatever(&mut it);
        it
    }
}

しかし、const fnsは珟圚非垞に制限されおいるため、それを曞くこずさえできたせん...

理論的な正圓性には感謝したすが、 constはpureず同じではなく、説埗力のあるナヌスケヌスで必芁ない堎合は、これらの関数の䜿甚を奚励するために䜕もする必芁はないず思いたす。 。

最初に安定させるこずができるはるかに䜎いぶら䞋がっおいる果物があるず思いたす。 miriがなければ、初期化されおおらずれロ化された組み蟌み関数はずにかくほずんど意味がありたせん。 でもい぀か䌚いたいです。 最初にそれらを安定させ、䞭間の蚈算を初期化できない堎合でも、すべおの定数が初期化された結果を生成する必芁があるこずを芁求するこずもできたす。

ずは蚀うものの、ナニオンず安党でないコヌドを䜿甚するず、ずにかく初期化されおいない、たたはれロにされたものを゚ミュレヌトできるため、それらを非定数に保぀こずにはあたり意味がありたせん

unionの助けを借りお、前のコヌドがコンパむルされるようになりたした。 それは絶察に恐ろしいです😅。

すべおの良い点も。 これらの組み蟌み関数はナヌスケヌスリストではかなり䜎いですが、それでも最終的なconst nessの適切な候補です。

それは恐ろしく驚くべきこずです。

だから...なぜあなたはmem::uninitializedを構成するこずを䞻匵しおいるのですか
たずえば、Instant :: nowずは察照的ですか :)

非定数の構造䜓には定数初期化子が必芁です
むンテリアは本物ですMutexを参照。 しかし、私はこのマラヌキヌを䜜るずは思わない
簡単にするのが正しい方法です

2018幎1月25日朚曜日午前2時21分、Stephen Fleischman <
[email protected]>は次のように曞いおいたす

ナニオンの助けを借りお、以前のコヌドはコンパむルされたす
https://play.rust-lang.org/?gist=be075cf12f63dee3b2e2b65a12a3c854&version=nightly 。
それは絶察に恐ろしいです😅。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/rust-lang/rust/issues/24111#issuecomment-360382201 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAC3n-HyWD6MUEbfHkUUXonh9ORGPSRoks5tOCtegaJpZM4D66IA
。

Instant::nowをconstにするこずはできたせん。 その関数は䜕を返したすか コンパむルの時間は

誰かがこれを安定させるために䜕をする必芁があるかを芁玄できたすか どのような決定を䞋す必芁がありたすか これを安定させるかどうか

パタヌンずの統合䟋https//gist.github.com/d0ff1de8b6fc15ef1bb6

芁旚に぀いおはすでにコメントしたしたが、珟圚const fnをパタヌンで照合できないこずを考えるず、これは安定化を劚げるべきではありたせんか それが理にかなっおいるなら、埌でい぀でもそれを蚱可するこずができたす。

Instant::nowをconstにするこずはできたせん。 その関数は䜕を返したすか コンパむルの時間は

ただし、constであるInstant::zero()たたはInstant::min_value()が存圚する可胜性がありたす。

誰かがこれを安定させるために䜕をする必芁があるかを芁玄できたすか どのような決定を䞋す必芁がありたすか これを安定させるかどうか

唯䞀の未解決の質問は、const fnチェックが、constfn内で䞍芁なものを誀っお蚱可/安定化しないように十分に厳密であるかどうかです。

rust-lang / rfcs2272を介しおパタヌンずの統合を行うこずはできたすか パタヌンは珟圚のようにすでに痛いので、もっず痛くしないようにしたしょう。

唯䞀の未解決の質問は、const fnチェックが、constfn内で䞍芁なものを誀っお蚱可/安定化しないように十分に厳密であるかどうかです。

私が間違っおいる堎合は蚂正しおください。ただし、これらのチェックは、 const右蟺倀の本䜓で珟圚蚱可されおいるチェックず同じではありたせんか const FOO: Type = { body };ずconst FOO: Type = foo(); const fn foo() -> Type { body }は、任意のボディに䜿甚できるものが同じであるずいう印象を受けたした。

@sgrif懞念は、 const fnにはあるが、 constにはない匕数に関するものだず思いたす。
たた、長期的には、今日のconst fnシステムを維持したいずいうこずは明らかではありたせん。

代わりに、constゞェネリック䞡方の方法を提案しおいたすか 䟋 <const T> + const C<T>別名const C<const T> 

コンパむル時に匏を評䟡しようずするtry_const!マクロが本圓に欲しいのですが、䞍可胜な堎合はパニックになりたす。 このマクロはmiriを䜿甚しお非const fnsを呌び出すこずができるため、std内のすべおの関数がconstfnずマヌクされるたで埅぀必芁はありたせん。 ただし、名前が瀺すように、い぀でも倱敗する可胜性があるため、関数が曎新されおconstにできない堎合は、コンパむルが停止したす。

@ Badel2なぜそのような機胜が必芁なのかは理解できたすが、それを広く䜿甚するこずは朚枠の生態系にずっお本圓に悪いこずだず思いたす。 このようにするず、別のクレヌトの関数がコンパむル時に評䟡可胜になるかどうかに応じおクレヌトが䜜成され、クレヌトの䜜成者が関数のシグネチャに圱響を䞎えずに関数をコンパむル時に評䟡できないように倉曎する可胜性があるためです。

関数が最初にconst fnずマヌクされおいた堎合、クレヌトの䜜成者はクレヌトをコンパむルしようずしたずきに問題を盎接芋぀けたはずであり、泚釈に頌るこずができたす。

これだけが遊び堎で機胜した堎合... https//play.rust-lang.org/gist = 6c0a46ee8299e36202f959908e8189e6version = stable

これは、ビルドされたプログラムにビルド時間を含めるための移怍性のない実際、移怍性がないため、私のシステムでは機胜したすが、遊び堎では機胜したせんが、どちらもLinuxです方法です。

移怍可胜な方法は、const評䟡でSystemTime :: nowを蚱可するこずです。

これは、 const fnであるかどうかに関係なく、任意の関数/匏のconst / compile-time-evalの匕数です。

これは、include_bytesで絶察パスを犁止するための議論のように聞こえたす😃

SystemTime ::nowをconstfnで蚱可するず、 const FOO: [u8; SystemTime::now()] = [42; SystemTime::now()];は、システムパフォヌマンス、スケゞュヌラ、およびJupiterの䜍眮に応じおランダムに゚ラヌになりたす。

さらに悪いこずに

const TIME: SystemTime = SystemTime::now();

TIMEの倀がすべおの䜿甚サむトで同じであるこずを意味するわけではありたせん。特に、むンクリメンタルを䜿甚したコンパむル間およびクレヌト間で同じです。

さらにクレむゞヌなのは、 foo.clone()を非垞に䞍健党な方法で台無しにする可胜性があるこずです。これは、長さ3の配列からクロヌンimplを遞択するこずになるかもしれたせんが、戻り倀の型は長さ4の配列である可胜性があるためです。

したがっお、任意の関数の呌び出しを蚱可したずしおも、真の乱数ゞェネレヌタヌを蚱可しないのず同じように、SystemTime :: newが正垞に戻るこずを蚱可するこずはありたせん。

@ SoniEx2これはここでは少しオフトピックだず思いたすが、カヌゎbuild.rsファむルを䜿甚しお、今日すでにそのようなものを実装できたす。 Cargo Bookのビルドスクリプト、特にコヌド生成のケヌススタディのセクションを参照しおください。

@ oli-obk 1぀はAPIの安党性のバヌゞョン管理に関するもので、もう1぀はビルド環境に関するものであるため、完党に同じ問題ではないず思いたすが、泚意しお適甚しないず、どちらも゚コシステムの砎損に぀ながる可胜性があるこずに同意したす。

const fnで珟圚の時刻を取埗するこずを蚱可しないでください; ビルドを再珟䞍可胜にするために、より倚くの/より簡単な方法を远加する必芁はありたせん。

const fnにあらゆる皮類の非決定論乱数、珟圚の時刻などを蚱可するこずはできたせん-rustcは定数匏が垞に䞎えられた同じ結果に評䟡されるず想定しおいるため、型システムの䞍健党性に぀ながる可胜性がありたす同じ入力。 もう少し説明が必芁な堎合は、ここを参照しおください。

https://github.com/rust-lang/rust/issues/24111#issuecomment -376352844のようなケヌスを凊理するための将来の方法は、珟圚の時刻を取埗しおプレヌンな数倀ずしお出力する単玔な手続き型マクロを䜿甚するこずです。文字列トヌクン。 手続き型マクロは、倚かれ少なかれ完党に制限のないコヌドであり、非constRustコヌドが䜿甚する通垞の移怍可胜な方法のいずれかで時間を取埗できたす。

@rfcbotfcpマヌゞ

これをマヌゞするこずを提案したす。これは、やや健党なオプションであり、重倧な倉曎ではなく、偶発的な重倧な倉曎他のクレヌトがconstコンテキストで関数を䜿甚しおいるずきに、constを評䟡できないように関数を倉曎するを防止するためです。それに぀いお本圓に悪いこずは、関数宣蚀の束の前にconstをスロヌしなければならないこずです。

@ oli -obkに代わっお@rfcbotfcpマヌゞ-安定化に぀いお考え、問題を議論する䟡倀があるようです

チヌムメンバヌ@nrcは、これをマヌゞするこずを提案したした。 次のステップは、タグ付けされた残りのチヌムによるレビュヌです。

  • [x] @aturon
  • [x] @cramertj
  • [] @eddyb
  • [x] @joshtriplett
  • [] @nikomatsakis
  • [x] @nrc
  • [] @pnkfelix
  • [x] @scottmcm
  • [x] @withoutboats

懞念

  • デザむンhttps://github.com/rust-lang/rust/issues/24111#issuecomment-376829588
  • parallel-const-traitsはhttps://github.com/rust-lang/rust/issues/24111#issuecomment-377133537によっお解決されたした
  • 優先床https://github.com/rust-lang/rust/issues/24111#issuecomment-376652507
  • runtime-pointer-addresseshttps://github.com/rust-lang/rust/issues/24111#issuecomment-386745312

レビュヌアの過半数が承認するずそしお反察はありたせん、これは最終コメント期間に入りたす。 このプロセスのどの時点でも提起されおいない倧きな問題を芋぀けた堎合は、声を䞊げおください。

タグ付けされたチヌムメンバヌが私に䞎えるこずができるコマンドに぀いおは、このドキュメントを参照しおください。

@rfcbot懞念の優先順䜍

フォヌルアりトに察凊するための垯域幅がないず思うので、゚ディションが終了するたでこれを詊しおみたいず思うかもしれたせん。

@rfcbotはすべおに関係したす-const

最終的には、すべおの関数をconstできるようにするむンセンティブがあるC++の䞖界になりたす。

@ oli-obkずの短い議論の芁玄

  1. 将来的には、ほがすべおの関数にconstのマヌクが付けられる可胜性がありたす。 たずえば、 Vecのすべおがconstになる可胜性がありたす。 その䞖界では、 constキヌワヌドを完党に取り陀くこずは理にかなっおいるかもしれたせんほずんどすべおがconstになる可胜性があり、関数をconstからnonに倉曎するために自分の邪魔にならないようにする必芁がありたす-constなので、掚定されたconstnessに関する埌方互換性の危険性はおそらくそれほど高くはないでしょう。

  2. ただし、今日constを取り陀くこずは珟実的ではありたせん。 今日のミリはすべおを解釈するこずはできず、本番環境で完党にテストされおいるわけではありたせん。

  3. 実際には、今日constを芁求し、このキヌワヌドずswtichを非掚奚にしお、将来的に掚定される恒垞性を確保するための䞋䜍互換性がありたす。

1、2、および3を組み合わせるず、将来のリリヌスで定数評䟡可胜な関数のセットを拡匵するよりも、今日constキヌワヌドを安定させるための優れたオプションのようです。 しばらくするず、すべおを評䟡できる、培底的に戊闘テストされたホニヌアナグマの定数評䟡者が登堎したす。 その時点で、掚定定数に切り替えるこずができたす。

フォヌルアりトの危険性に぀いおconst fnは、特に埋め蟌みで、倜間に頻繁に䜿甚されおいたす。 たた、const fnチェッカヌは、静的初期化子および定数に䜿甚されるチェッカヌず同じチェッカヌです䞀郚の静的固有のチェックず関数の匕数を陀く。

私が芋る䞻な欠点は、基本的に朚枠党䜓にconstを自由にスプレヌするこずを提唱しおいるこずです今のずころ、将来のアむデアに぀いおは@matkladの投皿を参照しおください

@rfcbotはparallel-const-traitsに関係したす

これを安定させるず、すぐにたくさんのクレヌトが䞊列特性階局を䜜成し、先頭にConstが衚瀺されたす ConstDefault 、 ConstFrom 、 ConstInto 、 ConstClone 、 ConstTryFrom 、 ConstTryIntoなど、 ConstIndexなどを芁求したす。 それはひどいこずではありたせん-TryFromを安定させるこずは助けになりたすが、今日は確かにTryで少しありたす-しかし、少なくずもそれをより良く解決するための蚈画のスケッチがあればいいず思いたす。 それはhttps://github.com/rust-lang/rfcs/pull/2237ですかわかりたせん。

 @nrc ボットはあなたの懞念事項の1぀だけを登録したようです

Parallel-const-traitsは、仮想の将来のconst-all-the-thingsバヌゞョンで簡単な解決策を持っおいたす。 圌らはただ働くだろう。

const fnの䞖界では、const fnトレむトメ゜ッドatmでは蚱可されおいたせんを蚱可しない限り、トレむトの重耇が発生するこずはありたせん。 もちろん、関連する定数を倜間に䜜成するこずもできたす。これは、libstdが1幎前にあったような状況で、プラむベヌトフィヌルドを公開せずに、静的/定数内のさたざたな型を初期化するための定数がたくさんありたした。 しかし、それはすでにしばらくの間起こっおいた可胜性があり、そうではなかったものです。

明確にするために、 ConstDefaultは、 const fnなしで今日すでに可胜であり、残りの䟋 ConstFrom 、 ConstInto 、 ConstClone 、 ConstTryFrom 、 ConstTryInto は、@ oli-obkが述べたように、const traitメ゜ッドを远加しないため、この機胜が安定しおいおも䞍可胜です。

 ConstDefaultは、関連付けられたconst fnではなく関連付けられたconstを䜿甚するこずで可胜ですが、私が知る限り、電力は同等です。

特性定矩の@scottmcm const fnは、今日は䞍可胜ですああ、 @ solsonはすでにそれに぀いお蚀及しおいたす。

@eddybランダムなアむデアトレむト定矩にconst fnを远加する代わりに、トレむトをconst implできるようにした堎合はどうなりたすか これら2぀も盞互に排他的ではありたせん。

@whitequark https://github.com/rust-lang/rfcs/pull/2237は、 const implを組み合わせおfnごずにconst fnに拡匵するこずで、そのアむデアをカバヌしおいたす。 implであり、すべおのconstメ゜ッドでimplが、 constのメ゜ッドをマヌクせずに、 T: const Traitの境界を満たすこずを蚱可したす。特性の定矩自䜓。

@rfcbot懞念デザむン

私たちは歎史的に、いく぀かの理由から、特定のconst fnシステムを安定させるこずに力を泚いできたした。

  • 珟圚のものは、 const fnメ゜ッドを必芁ずする$$ trait $$、たたはconst fnメ゜ッドを提䟛するトレむトimplをサポヌトしおいたせんhttps//githubを参照。これを行ういく぀かの方法に぀いおは、com / rust-lang / rfcs / pull / 2237
  • これに関連しお、 T: Traitを介しお䜿甚されるメ゜ッドを、個別の特性を持たずにconst fnにバむンドしお、できればコンパむル時に䜿甚する堎合にのみ芁求するずいう問題がありたす䟋 Option::mapは実行時に同じように機胜したすが、CTFEでconst-callableクロヌゞャが必芁です
  • 倚くのアルゎリズム、コレクション、および抜象化が朜圚的に定数評䟡可胜であるため、どこでもconst fnを䜿甚するクレヌト党䜓が存圚する可胜性がありたす libcoreが思い浮かびたす

これらの問題のほずんどたたはすべおを他の人を玹介するこずを犠牲にしお軜枛するさたざたな蚭蚈䞊の遞択がありたす。たずえば、これらは次のようなものです。

  • アノテヌションを必芁ずせず、コンパむラ゚ラヌを発行するだけで、miriは評䟡に倱敗したす

    • 長所よりクリヌンなコヌドベヌス、関連する倀によっおは、䞀定の評䟡がすでに倱敗する可胜性がありたす

    • 短所蚀語レベルの動䜜ドキュメントずsemver境界がないため、他の人のコヌドをmiriにスロヌしお、それらが行った小さな倉曎を芳察できたす。たずえば、䟝存関係の1぀のパッチバヌゞョンにランタむムデバッグログが远加されたす。 たた、䟡倀の促進は行うのが難しい

  • function / impl / module/etcごずに䞊蚘の動䜜をオプトむンする方法。

    • これらの関数の本䜓は少なくずもconst fnに関しおはマクロのように動䜜したす

    • 長所semverの圱響がなく、䞀郚の分析の範囲が制限されおいる

    • 短所ただ優れたドキュメントではなく、圱響を受ける動䜜が明確ではありたせんconst-evaluatabilityだけですか、䜓の倉化は、semver-breakingずしおカりントされる可胜性がありたす

このようにするず、別のクレヌトの関数がコンパむル時に評䟡可胜になるかどうかに応じおクレヌトが䜜成され、クレヌトの䜜成者が関数のシグネチャに圱響を䞎えずに関数をコンパむル時に評䟡できないように倉曎する可胜性があるためです。

@leoschwarzこれはすでに自動特性の問題ではありたせんか おそらくこれに察する解決策は、錆びたセンバヌず貚物を統合しお、この皮の意図しない砎損を怜出するこずです。

ずは蚀うものの、miriにラむブラリの䜜成者ずしおのあなたが誀っお超過した評䟡時間制限があり、ダりンストリヌムでコンパむルが倱敗した堎合にどうなるかは私にはわかりたせん。

@nrc 「everything-const」は正しいず思いたすが、問題ではありたせん。 はい、最終的には膚倧な量のconstをマヌクするこずになりたす。

掚枬されたすべおのものが欲しいかどうかわからないこずを指摘したいだけです
const。 実行時間ずコンパむル時間のどちらが長いかに぀いおの決定です
重芁。 時々私はコンパむラがでかなり十分な蚈算をしおいるず思いたす
コンパむル時

2018幎3月28日氎曜日午埌2時49分、Josh [email protected]
曞きたした

@nrc https://github.com/nrc「everything-const 」は正しいず思いたすが、そうではありたせん
問題。 はい、私たちは物事の巚倧な垯をconstにマヌクするこずになりたす。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/rust-lang/rust/issues/24111#issuecomment-376914220 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAC3ny9Wm9JK6p-fXf6gbaEgjFtBpMctks5ti6LigaJpZM4D66IA
。

評䟡期限

その制限はすぐになくなりたす。

掚枬されたすべおがconstであるかどうかわからないこずを指摘したいだけです。

いいえ、コンパむル時にランダムに蚈算するこずはありたせん。 静力孊、定数、列挙型のバリアント刀別匏、および配列の長さの本䜓でランダムなものを蚈算できるようにするだけです

@rfcbotはparallel-const-traitsを解決したした

蚂正しおくれおありがずう、皆さん

その制限はすぐになくなりたす。

玠晎らしい。 その堎合、auto-const-fnrust-semververの統合などず組み合わせお、砎損に関する情報を提䟛するは玠晎らしいように聞こえたすが、「ロギングを远加しお砎損を匕き起こす」こずは問題になる可胜性がありたす。 私が掚枬するバヌゞョン番号を䞊げるこずはできたすが、それは有限ではありたせん。

ロギングず印刷は、私の定数モデルでは「现かい」副䜜甚です。 党員が同意すれば、その解決策を芋぀けるこずができるでしょう。 ファむルに曞き蟌むこずもできたす実際にはそうではありたせんが、行ったように動䜜しおすべおを砎棄したす。

私は副䜜甚を黙っお捚おるこずを本圓に心配しおいたす。

それらの呚りにRFCを䜜成したら、それに぀いお話し合うこずができたす。 今のずころ、定数に「副䜜甚」を持たせるこずはできたせん。 トピックは、constfnの安定化ず盎亀しおいたす。

掚枬される「semverwarningを実行する」アプロヌチに぀いお少し心配しおいたす
恒垞性。 恒垞性に぀いお考えたこずのない朚枠の䜜者が芋た堎合
「譊告先ほど行った倉曎により、でfooを呌び出すこずができなくなりたす
以前は可胜だったconstコンテキスト」、圌らはそれを
非sequiturずそれを沈黙させたすか 明らかに、この問題の人々は頻繁に考えたす
どの関数がconstになり埗るかに぀いお。 そしおもっず倚くの人がやればいいのに
それconst_fnが安定したら。 しかし、すぐに䜿える譊告は正しいですか
それを奚励する方法は

2018幎3月29日朚曜日午前4時36分、Oliver [email protected]
曞きたした

それらの呚りにRFCを䜜成したら、それに぀いお話し合うこずができたす。 今のずころあなたはただ
定数に「副䜜甚」を持たせるこずはできたせん。 トピックはに盎亀しおいたす
constfnの安定化

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/rust-lang/rust/issues/24111#issuecomment-377164275 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAC3n3MtmvrDF42Iy0nhZ2q8xC-QGcvXks5tjJ0ggaJpZM4D66IA
。

明瀺的なconstfnは、倚くのAPIを煩わしく混乱させる可胜性があるず思いたすが、暗黙的に想定する代わりに、実行するには問題が倚すぎるず思いたす。

  • constたたはnonconstず呌ばれる堎合、副䜜甚を砎棄するず、コヌドの動䜜が異なる可胜性がありたすたずえば、ファむルの曞き蟌みず読み取り。
  • extern関数を呌び出すず、垞に副䜜甚が発生する可胜性があるため、安党でないコヌドをconstfnず掚枬するこずはできたせん。
  • ゞェネリックコヌドのconstfnはい぀掚枬できたすか これは単圢化時に行われたすか

しかし、明瀺しないこずの最倧の問題は、誰かが気付かないうちに1回の倉曎で誀っお倚くのコヌドを壊しおしたう可胜性があるこずです。 これは、Rust゚コシステムで䞀般的な長い䟝存関係グラフで特に懞念されたす。 関数シグネチャに明瀺的な倉曎が必芁な堎合は、これが重倧な倉曎であるこずに気付くでしょう。

たぶん、そのような機胜は、クレヌトのルヌト、 #![infer_const_fn]などに远加できるクレヌトレベルの構成フラグずしお実装でき、氞久にオプトむンしたたたになりたす。 フラグが远加された堎合、const fnは可胜な堎合はクレヌトで掚枬され、ドキュメントにも反映されたすたた、呌び出された関数もconst fnである必芁がありたす。クレヌトの䜜成者がこのフラグを远加した堎合、泚意が必芁です。バヌゞョン管理に぀いお、そしお倚分さびたsemververは匷制されるかもしれたせん。

逆にそれをするのはどうですか

const fnを䜿甚するのではなく、sidefnを䜿甚したす。

それはただ明瀺的でありサむドfnを呌び出すにはサむドfnを配眮する必芁があり、明瀺的に互換性を壊したす、混乱を取り陀きたす。 いく぀かの組み蟌み関数ずasmを持぀ものはすべおサむドfnになりたす。

゚ディションに远加できるず思いたすが、䞋䜍互換性はありたせん。

2018幎3月30日2:43:06AMGMT + 0800、「SoniL。」 [email protected]は次のように曞いおいたす

逆にそれをするのはどうですか

const fnを䜿甚するのではなく、sidefnを䜿甚したす。

それはただ明瀺的ですサむドfnを呌び出すにはサむドfnを配眮する必芁がありたす。
明瀺的に互換性を壊したす、そしお混乱を取り陀きたす。 いく぀か
組み蟌み関数ずasmを含むものはすべおサむドfnになりたす。

-
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺しおください。
https://github.com/rust-lang/rust/issues/24111#issuecomment -377333542

-
K-9メヌルでAndroidデバむスから送信されたした。 簡朔に申し蚳ありたせん。

より倧きな問題は、ほずんどのプログラミング蚀語が行うこずではないので、初心者にずっおは本圓にショックになるずいうこずだず思いたす。

@whitequarkそれを行うだけのこず「副䜜甚を捚おる」には同意したせん。@ oli-obkは将来の拡匵に぀いお話しおいたず思いたすが、私が行った議論から、次のこずがわかりたす。

  • 「決定論的副䜜甚」䞍玔なデヌタを返さないを区別できたす
  • たずえば「コンパむル時にデヌタをログに蚘録する」堎合は、特別なAPIを䜿甚できたす。

    • 増分オンデマンドコンパむルが必ずしも䞀貫した出力をもたらすずは限らないため、これは、必芁な倖郚決定論のレベルによっおはかなり困難です。

  • 具䜓的には、珟圚存圚し、グロヌバル/CFFIを䜿甚しおいるものには觊れたせん。

線集議論が狂わないように、䟋えば

constたたはnonconstず呌ばれる堎合、副䜜甚を砎棄するず、コヌドの動䜜が異なる可胜性がありたすたずえば、ファむルの曞き蟌みず読み取り。

私たちはおそらくそのような副䜜甚を捚おるこずに関しお@oli-obkのミスポヌクを想定するこずができたす。

たぶん、そのような機胜は、クレヌトのルヌトに远加できるクレヌトレベルの構成フラグずしお実装できたす。

これは、 https //github.com/rust-lang/rust/issues/24111#issuecomment-376829588からの過去の提案の2番目の䟋のサブセットです。
スコヌプが「構成フラグ」である堎合、ナヌザヌはよりきめ现かいスコヌプIMOを遞択できるはずです。

逆にそれをするのはどうですか
const fnを䜿甚するのではなく、sidefnを䜿甚したす。
それはただ明瀺的でありサむドfnを呌び出すにはサむドfnを配眮する必芁があり、明瀺的に互換性を壊したす、混乱を取り陀きたす。 いく぀かの組み蟌み関数ずasmを持぀ものはすべおサむドfnになりたす。

https://github.com/rust-lang/rust/issues/24111#issuecomment -376829588で、ラむブラリ党䜓が「すべおconst fn 」たたは「すべおside fn 」になる可胜性があるこずを指摘しようずしたした"。
関数宣蚀ではなくスコヌプが蚭定されおいれば、将来の゚ディションで機胜する可胜性がありたす。
ただし、「身䜓から掚枬する」セマンティクスがないず、オプトむンside fnの堎合でも特性の盞互䜜甚を蚭蚈する必芁があるため、䜕も埗られず、朜圚的に倧きな摩擊が発生したす。

Kenton Vardaの「有害ず考えられるシングルトン」の蚘事のセクション3.3は、ここに関連しおいるようです正盎なずころ、すべおを読む䟡倀がありたす。

デバッグログはどうですか

実際には、すべおのコヌドでデバッグログを利甚できるようにする必芁があるこずを誰もが認めおいたす。 䟋倖ずしたす。 この䟋倖の正確な理論的根拠は、気になる人のために、いく぀かの方法で提䟛できたす。

セキュリティの芳点から、デバッグログは無害なシングルトンです。 曞き蟌み専甚のため、通信チャネルずしお䜿甚できたせん。 たた、デバッグログはプログラムの正確さの芁因ではないため、デバッグログに曞き蟌むこずによっお䜕らかの損害を匕き起こすこずは明らかに䞍可胜です。 悪意のあるモゞュヌルがログを「スパム」した堎合でも、デバッグログは通垞、各メッセヌゞを生成したモゞュヌルを正確に識別するため、そのモゞュヌルからのメッセヌゞは簡単に陀倖できたすスタックトレヌスを提䟛する堎合もありたす。 したがっお、提䟛しおも問題ありたせん。

デバッグログが読みやすさ、テスト容易性、たたは保守性に害を及がさないこずを瀺すために、同様の議論を行うこずができたす。

デバッグログのもう1぀の理論䞊の正圓性は、デバッグログ関数は実際にはデバッガヌによっお芳察される単なる操䜜なしであるず述べおいたす。 デバッガヌが実行されおいない堎合、関数は䜕もしたせん。 䞀般に、デバッグは明らかにオブゞェクト機胜モデル党䜓を砎壊したすが、明らかに特暩操䜜でもありたす。

「[デバッグ甚の]解決策を芋぀けるこずができる」ずいう私の発蚀は、実際には、constsから呌び出すこずができるが、䜕らかの圢で印刷される朜圚的な将来のAPIに蚀及しおいたした。 プラットフォヌム固有の印刷操䜜をランダムに実装するこずprint / debugステヌトメントを䜿甚しお既存のコヌドをconstにするこずができるようにするためは、const゚バリュ゚ヌタヌが行うべきこずではありたせん。 これは玔粋にオプトむンであり、芳察可胜な動䜜が明瀺的に異なるこずはありたせんたずえば、実行時のconst evalおよびコマンドラむン/ファむル出力での譊告。 正確なセマンティクスは将来のRFCに委ねられおおり、䞀般にconstfnに察しお完党に盎亀しおいるず芋なす必芁がありたす。

const impl TraitずT: const Traitに重倧な欠点はありたすか

constの呚りにさらに倚くのスプレヌをかける以倖に、䞀郚の特性メ゜ッドのみがconstである可胜性があり、よりきめ现かい制埡が必芁になりたす。 しかし、それを指定するためのきちんずした構文はわかりたせん。 たぶんwhere <T as Trait>::some_method is const  isはコンテキストキヌワヌドである可胜性がありたす。

繰り返したすが、これはconstfnに盎亀したす。

[u8; SizeOf<T>::Output]

constずsidefnsが分離しおいる堎合は、実際の蚭蚈䞊の考慮事項を考慮する必芁がありたす。 それらを分離する最も簡単な方法は、const fnsを、珟圚あるもの、぀たりチュヌリング完党型システムの拡匵にするこずです。

たたは、const fnsを実際にconstにしたす。constfnはすべお、すべおのパラメヌタヌがconstゞェネリックであるかのように評䟡する必芁がありたす。

これにより、珟圚のconst fnsに぀いお個人的に掚論するこずができないため、掚論がはるかに簡単になりたす。 チュヌリング完党型、マクロ、通垞のfnsなどに぀いお掚論するこずはできたすが、现かい郚分でも意味が完党に倉わるため、constfnに぀いお掚論するこずは䞍可胜です。

现かい郚分でも意味が完党に倉わるからです。

詳现を教えおいただけたすか const fnポむンタヌ、 constトレむト境界などの拡匵機胜を意味したすか むき出しのconst fnの提案には现かい詳现が芋圓たらないからです。

たたは、const fnsを実際にconstにしたす。constfnはすべお、すべおのパラメヌタヌがconstゞェネリックであるかのように評䟡する必芁がありたす。

これがコンパむル時に行っおいるこずです。 実行時に、この関数は他の関数ず同じように䜿甚されたす。

問題は、现かい郚分があれば、定数評䟡が実行時評䟡に倉わる可胜性があるこずです。 これは、最初は倧したこずではないように思われるかもしれたせんが、そうなる可胜性がありたす。

すべおconstfnsであるため、関数呌び出しが本圓に長いずしたしょう。 そしお、それを耇数の行に分割したいず思いたす。

したがっお、いく぀かのletを远加したす。

これで、プログラムの実行に20倍の時間がかかりたす。

@ SoniEx2配列のサむズ $N [u8; $N] は、垞にコンパむル時に評䟡されたす。 その匏がconst以倖の堎合、コンパむルは倱敗したす。 逆に、 let x = foo()は、 const fnであるかどうかに関係なく、実行時にfooを呌び出したすオプティマむザヌのむンラむン化ず定数䌝​​播を法ずしお、これはconst fnずは完党に別です。 。 コンパむル時に匏を評䟡した結果に名前を付ける堎合は、 constアむテムが必芁です。

これで、プログラムの実行に20倍の時間がかかりたす。

それは、const fnがどのように機胜するかずいうこずではありたせん

関数const fnを宣蚀し、その䞭にletバむンディングを远加するず、コヌドのコンパむルが停止したす。

const fn constを削陀するず、これは重倧な倉曎であり、 const 、 static 、たたは配列の長さなど、その関数のすべおの䜿甚が䞭断されたす。 ランタむムコヌドでconst fnを実行したコヌドは、コンパむル時に実行されるこずはありたせん。 これは通垞のランタむム関数呌び出しであるため、遅くなるこずはありたせん。

線集 @SimonSapinは私をそれに打ち負かしたしたD

Const fnは、可胜であればコンパむル時に評䟡されたす。

あれは、

const fn random() -> i32 {
    4
}

fn thing() -> i32 {
    let i = random(); // the RHS of this binding is evaluated at compile-time, there is no call to random at runtime.
}

ここで、匕数を取るconstfnがあるずしたす。 これはコンパむル時に評䟡されたす

fn thing() {
    let x = const_fn_with_1_arg(const_fn_returns_value());
}

これにより、実行時にconst_fn_with_1_argが評䟡されたす。

fn thing() {
    let x = const_fn_returns_value();
    let y = const_fn_with_1_arg(x); // suddenly your program takes 20x longer to run, and compiles 20x faster.
}

@eddyb 「最小constfn」が将来のすべおの拡匵機胜ず䞊䜍互換性があるずいう芳察によっお、蚭蚈䞊の懞念を解決できるかどうか疑問に思いたす。 ぀たり、私は安定したいずいうこずです

フリヌ関数ず固有のメ゜ッドをconstずしおマヌクし、定数匕数を䜿甚しお定数コンテキストで呌び出すこずができるようにしたす。

これは、「特性の定数効果」蚭蚈ず簡単に完党に䞊䜍互換性があるようです。 埌でconstオプションにするこずができるため、「掚定定数」蚭蚈ずも互換性がありたす。

珟圚の「最小定数fn」提案ず互換性のない代替の将来の蚭蚈はありたすか

@nrc

rfcbotはeverything-constの懞念事項を登録しなかったこずに泚意しおくださいコメントごずに1぀の懞念事項ただし、これは蚭蚈䞊の懞念事項のサブセットのようです。これは、以前のコメントTL; DR珟圚の最小限の提案で察凊されおいたす。すべおず完党に互換性があるため、将来的にconstキヌワヌドをオプションにする可胜性がありたす。

優先順䜍/攟射性降䞋物の懞念に぀いおは、私たちがすべおの手で議論したこずず、ただ文曞化しおいないこずを文曞化したいず思いたす。

  • const fn foo(x: i32) -> i32 { body }は、 const FOO: i32 = body;を超える比范的マむナヌな远加であるため、フォヌルアりトのリスクはわずかです。 ぀たり、実際にconst fnを実装するコヌドのほずんどは、安定したコンパむラですでに懞呜に機胜しおいたす免責事項これは@ oli-obkから聞いたもので、間違っお聞いた可胜性がありたす。

  • 埋め蟌たれたワヌキンググルヌプはconstfnをひどく望んでいたす:)

さらに、 const fnを安定させないず、ラむブラリ内で最適ではないAPIが急増するこずに泚意しおください。これは、const fnsの䞍足を回避するために、 ATOMIC_USIZE_INITなどのトリックを䜿甚する必芁があるためです。

i = random;ずしたす。 //このバむンディングのRHSはコンパむル時に評䟡され、実行時にランダムぞの呌び出しはありたせん。

いいえ、それはたったく起こっおいたせん。 発生しおいる可胜性がありたすがおそらくllvmがこれを実行しおいたす、ヒュヌリスティックに䟝存するコンパむラヌの最適化が実際に発生するこずは期埅できたせん。 コンパむル時に䜕かを蚈算したい堎合は、それをconstに貌り付ければ、その保蚌が埗られたす。

したがっお、const fnはconstでのみ評䟡され、これは基本的に他の方法では圹に立ちたせんか

では、constずnon-const fnを厳密に分離しおみたせんか

セマンティクスは、コンパむル時ず実行時のものを意図的に混同しおいるため、混乱しおいるこずがわかりたす。

したがっお、const fnはconstでのみ評䟡され、これは基本的に他の方法では圹に立ちたせんか

それらは圹に立たないわけではなく、他の関数ず同じように実行時に実行されたす。 これは、const評䟡を行っおいるかどうかに応じお、Rustの異なる「サブ蚀語」を䜿甚する必芁がないこずを意味したす。

では、constずnon-const fnを厳密に分離しおみたせんか

const fnの党䜓的な動機は、この分離がないこずです。 それ以倖の堎合は、䞡方の本䜓が同䞀であっおも、すべおの皮類の関数を耇補する必芁がありたす AtomicUsize::new() + AtomicUsize::const_new() 。

libcoreの90を2回曞き蟌む必芁がありたすか1回はconst eval甚、もう1回はruntime甚ですか 同じこずがおそらく他の倚くの箱にも圓おはたりたす。

私はAtomicUsize::Of<value>を考えおいたした。 そしお、はい、私は未知の保蚌をするよりもむしろすべおを二床曞く必芁がありたす。 さらに、これは、䜕かが怜蚌されおいるかどうかに基づいお異なる動䜜をするこずはありたせん。

const評䟡を保蚌するためにconstfnでconstsを宣蚀できたすか再垰的なconst fnの堎合 たたは、constゞェネリックを通過する必芁がありたすか 等。

@ SoniEx2は、 const fnを利甚し、いずれかの関数がconst以倖になるず、コンパむル時゚ラヌになるように䟋を䜜成する方法の䟋です。

fn thing() {
    const x: u32 = const_fn_returns_value();
    const y: u32 = const_fn_with_1_arg(x);
}

遊び堎でのフルランニングの䟋

型掚論がないため、人間工孊的ではありたせんが、将来倉曎される可胜性がありたす。

未知の保蚌を持぀よりも。

あなたはずおも芪切で、䜕かが䞍明確だず思うずころの䟋をいく぀か挙げおいただけたすか

const評䟡を保蚌するためにconstfnでconstsを宣蚀できたすか再垰的なconst fnの堎合 たたは、constゞェネリックを通過する必芁がありたすか 等。

const fnのポむントは、コンパむル時に魔法のように物事を評䟡するこずではありたせん。 コンパむル時に物事を評䟡できるようにするこずです。

rustcはllvmに基づいおいたため、コンパむル時に魔法のように物事を評䟡するこずはすでに行われおいたす。 だから...たさにそれがocamlで実装されなくなったずき。 rustcから定数䌝播を削陀したいず思う人はいないず思いたす。

const fnは、定数の䌝播にはたったく圱響したせん。 誀っおconstが䌝播される可胜性のある関数があり、llvmがそれを行った堎合、その関数をconstが䌝播できないように倉曎するず、llvmはそれを停止したす。 これは、 constを関数にアタッチするこずずは完党に独立しおいたす。 llvmにずっお、 const fnずfnの間に違いはありたせん。

同時に、 constをfnにアタッチしおも、rustcの動䜜はたったく倉わりたせん関数が有効なconst fnであるず仮定するず、そうしおもコンパむルされたす。 今埌は、定数でこの関数を呌び出すこずしかできたせん。

私はLLVMに぀いおは考えおいたせん、さびに぀いお考えおいたす。 ここではLLVMは重芁ではありたせん。

@ SoniEx2

Const fnは、可胜であればコンパむル時に評䟡されたす。

これは正しくありたせん。 const fnは、特定のコンテキストで呌び出されるず、コンパむル時に評䟡されたす。 それが䞍可胜な堎合は、ハヌド゚ラヌが発生したす。 他のすべおのコンテキストでは、 constの郚分はたったく重芁ではありたせん。

const fnを必芁ずするこのようなコンテキストの䟋は、配列の長さです。 [i32; 15]ず曞くこずができたす。 コンパむラは7を蚈算できるため、 [i32; 3+4]ず曞くこずもできたす。 [i32; read_something_from_network()]ず曞くこずはできたせん。それはどのように意味があるのでしょうか この提案では、 fooがconst fn $の堎合、 $ [i32; foo(15)]ず曞くこずができたす。これにより、ネットワヌクぞのアクセスではなく、加算のようになりたす。

これは、プログラムの実行時に実行される可胜性のある、たたは実行される予定のコヌドに関するものではありたせん。 「たぶんコンパむル時に評䟡する」ずいうこずはありたせん。 「コンパむル時に評䟡するか、コンパむルを䞭止する必芁がある」だけです。

RFCもお読みください https //github.com/rust-lang/rfcs/blob/master/text/0911-const-fn.md

const fnアノテヌションを付ける代わりに、それが掚枬されたプロパティである堎合はどうなりたすか ゜ヌスコヌドでは明瀺的ではありたせんが、自動生成されたドキュメントでそのように自動的にラベル付けされる可胜性がありたす。 これにより、ラむブラリの䜜成者がコヌドを倉曎しなくおも、最終的にconstず芋なされるものを拡匵できたす。 最初は、掚論はconst fnが珟圚サポヌトしおいるものに制限される可胜性がありたすletバむンディングのない玔粋で決定論的な関数。

このアプロヌチでは、結果がconst倉数にバむンドされおいる堎合はコンパむル時に評䟡が行われ、それ以倖の堎合は実行時に評䟡が行われたす。 これは、関数が評䟡されるタむミングを呌び出し先ではなく呌び出し元が制埡できるため、より望たしいように思われたす。

これはすでにかなり培底的に議論されおいたす。 このアプロヌチの欠点は、誀っお別の方向に進むこずが容易になるこずです。誰かがconstコンテキストでラむブラリ関数を䜿甚しおいる可胜性がありたすが、ラむブラリの䜜成者はそれをconstでなくする可胜性がありたす。気付かずに

うヌん、はい、それは問題です...

線集私が考えるこずができる唯䞀の解決策は、 const fnたで行かなくおも、オプトアりトアノテヌションを付けるこずです。これにより、図曞通の䜜者はconstを砎る暩利を留保できたす。ネス。 しかし、それがどこにでもconst fnを振りかけるよりも良いかどうかはわかりたせん。 唯䞀の本圓の利点は、 constの定矩をより迅速に採甚するこずです。

線集2しかし、それは䞋䜍互換性を壊すだろうず思うので、それは初心者ではありたせん。 サむドトラックでごめんなさい。

だから...議論は終わった。 芁玄したしょう

rfcbotのコメントはhttps://github.com/rust-lang/rust/issues/24111#issuecomment-376649804です。

珟圚の懞念

  • これは優先事項ではなく、2018幎のリリヌスではすでに十分な量がプレヌトに远加されおいたす
  • すべおconstのマヌクを付け始めたすが、これは面倒です
  • これは私たちがコミットしたいデザむンですか

const fnが長い間毎晩焌かれおいるこずを陀いお、私は優先事項+攟射性降䞋物の懞念に぀いお本圓に話すこずはできたせん

他の2぀のポむントは密接に関連しおいたす。 @eddybの蚭蚈私が理解したようにhttps://github.com/rust-lang/rust/issues/24111#issuecomment-376829588は、 const fnではなく、 #[const]を䜿甚するこずです。あなたがものに叩き぀けるこずができる

#[const]
mod foo {
    pub fn square(i: i32) -> i32 { i * i }
}
#[const]
fn bar(s: &str) -> &str i{ s }
#[const]
fn boo() -> fn(u32) -> u32 { meh }
fn meh(u: u32) -> u32 { u + 1 }

そしお、それはそれでマヌクされたものすべおに再垰的に入るので、 #[const]モゞュヌル内の関数はすべお#[const] fnです。 #[const] fn内で宣蚀された関数も#[const] fnです。

これにより、必芁な泚釈の数が枛りたす。䞀郚のクレヌトは、 lib.rsで#![const]を叩き、それで完了するためです。

その蚭蚈で芋られる問題ただし、これらの問題はconst fnにもよく存圚したす

  • #[const]モゞュヌルツリヌの奥深くでいく぀かの非const関数を宣蚀できるようにしたい堎合があるため、オプトアりトのサポヌトが必芁になる堎合がありたす。
  • 匕数/戻り型の䜍眮にある#[const] fnぞの関数ポむンタは$ #[const] fnである必芁がありたすか

    • 繰り返したすが、オプトアりトが必芁になりたす

これらのこずを考える必芁があるので、consteval䞭に関数ポむンタヌを介しお関数を呌び出すこずができるようにしたい将来のバヌゞョンず互換性のないシステムを蚭蚈したせん。

私は特定のデザむンを提案したのではなく、いく぀かの既知のもっずもらしい方向性をリストしただけであるこずに泚意しおください。
元のアむデアは、 constに限定されない、䞀般化された「関数の本䜓を公開する」属性でしたが、倚くの可胜なバリ゚ヌションがあり、それらのいく぀かは良いかもしれたせん。

線集:(これを忘れたくない @solsonは、関数の本䜓からさたざたなものを自動的に導出する@patternのような属性がLeanにどのようにあるかを瀺しおいたした。

@ oli-obk unsafeは属性を䜿甚しないため、属性を䜿甚するべきではないず思いたす。
たた、 asyncも珟圚はそうではありたせん。 そしお、 try { .. }ブロックを指定しおtry fnを導入するず、属性ベヌスではない別のものがありたす。 効果のようなものをできるだけ䞀貫性を保぀ように努めるべきだず思いたす。 属性を䜿甚するかどうか。 #[target_feature(..)]は、党䜓的な䞀貫性にシワを付けたす。

PS const mod { .. }を䜿甚しお、倚かれ少なかれ#![const]ず同じ効果を埗るこずができたす。 これは、 try mod 、 async mod 、 unsafe modにも圓おはたりたす。

私はい぀も特別なタむプで物事をするこずに傟倒したす。

struct SizeOf<T>;

impl<T> SizeOf<T> {
    const intrisic Result: usize;
}

新しい構文で新しい抂念を孊ぶよりも、既存の構文を䜿っお新しいタむプを孊ぶ方が簡単です。

埌で実行時に型システムをサポヌトできたす。

fn sq(v: i32) -> i32 {
    Square<v>::Result
}

コンパむル時の型、コンパむル時たたは実行時のconstゞェネリック。

だから...私たちはそこにおそらくより良いデザむンがあるかもしれないずいう事実を無芖するこずを提案しおいたす。

  1. 掚論するのは簡単
  2. より寛容な蚭蚈ずの䞊䜍互換性
  3. 歎史的に䞍安定なコヌドで倧成功を収めるために䜿甚されおきたしたが、䞻な䞍満は十分な機胜ではありたせん。
  4. 泚釈を远加できる本䜓を持぀、ただ泚釈が付けられおいない関数に泚釈を远加するこずを提案するためにリントするこずができたす。
  5. 個人的には、マヌゞリク゚ストに投皿されおいるように、耇数幎の詊甚期間がなくおも安定できる唯䞀のデザむンだず考えおいたす。
  6. それぞれにカスタムコヌドを芁求する代わりに、実行時コヌドず定数コヌドの間でコヌドを共有できるようにしたす

埌で実行時に型システムをサポヌトできたす。

これは䟝存型ですが、実行時にconst fnを呌び出すず、今日は問題なく機胜したす。

@ oli-obk特性はどうですか トレむトのimplの䞀郚でのみconst fnであるトレむトメ゜ッドに察しお䜕をするのかを理解せずに、 const fnを安定させたくありたせん。

@eddybは、新しいconst境界ずメ゜ッドの蚘述を促進する必芁があるようです。 :)

@Centril私のポむントは、属性の提案キヌワヌドを䜿甚するかどうかに関係なくは、特性メ゜ッドを凊理するためのはるかに異なるアプロヌチをもたらすずいうこずです。それを比范する必芁がありたす。
珟圚のconst fnアプロヌチは単玔で拡匵可胜に芋えるかもしれたせんが、実際に拡匵された堎合はそうではありたせん。

ゞェネリックconsts+constゞェネリック

intrinsic const SizeOf<T>: usize;

const Pow<const V: usize>: usize = V*V;

@eddybconstfnデザむンず完党に互換性のあるさたざたな゜リュヌションを念頭に眮いおいたす。 曞きたす。

うわヌ、私はちょうどそれが始たったのは2幎であるのを芋たした。 安定化の予芋日はありたすか この拡匵機胜が安定するのを埅぀ため、 stableでほが利甚できるクレヌトがありたす。 :)

@rfcbotはruntime-pointer-addressesに関係したす

別の問題で、 const fnからの参照透過性が必芁かどうかずいう質問が発生し、生のポむンタヌのアドレスが非決定論のオラクルずしお䜿甚されるずいう問題が発生したした https ://github.com/rust- する前に、いく぀かの生のポむンタヌ操䜜をunsafe 今日でも蚱可されおいるものの数はわかりたせんにする必芁がありたす。

@eddyb E0018はconst fnにも適甚されたせんか

Cの方法では、盞察的぀たりオブゞェクト内で実行時に䜕らかの方法で远跡されない限り、オブゞェクトポむンタはすべお0にするこずができたす。

rustがCの゚むリアシングルヌルをサポヌトしおいるかどうかはわかりたせん。

@sgrif定数に関しお発生する゚ラヌの倚くは、遅かれ早かれ解消されたす-miriは、倀が衚瀺されるタむプを気にしたせんusize倀にある抜象的な堎所は、䟝然ずしお抜象的な堎所です。 そしおそれをポむンタヌにキャストするず、元のポむンタヌが返されたす。

確認したずころ、今のずころ、敎数ぞのポむンタヌのキャストず、ポむンタヌ間の比范挔算子の䞡方が、定数コンテキストで犁止されおいたす。 しかし、これは私たちが考えた通りであり、私はただ怖いです。

@eddybたあたあ。 ただし、 const fnにヒットした懞念は、今日すでにconstブロックにヒットしおいるず思いたす。

@sgrif違いは、 const ゞェネリック型パラメヌタヌに䟝存する関連するconstでさえはコンパむル時にmiriで完党に評䟡されたすが、 const fnは非const fnランタむム呌び出し甚。
したがっお、参照透過性が本圓に必芁な堎合は、miriで問題がない堎合でも、少なくずも安党なコヌドでは実行時の非決定性を匕き起こす可胜性のあるものを蚱可しないようにする必芁がありたす。
これはおそらく、たずえばNaNペむロヌドのために、floatのビットを取埗するこずも問題であるこずを意味したす。

ミリでやるべきこず

盞察的でない限り、すべおのポむンタは0です。 䟋えば

#[repr(C)]
struct X {
    a: usize,
    b: u8,
}
let x = X { a: 1, b: 2 };
let y: usize = 3;
assert_eq!(&x as *const _ as usize, 0);
assert_eq!(&x.a as *const _ as usize, 0);
assert_eq!(&x.b as *const _ as usize, 8);
assert_eq!(&y as *const _ as usize, 0);

次に、ミリ評䟡でそれらを远跡したす。 ポむンタヌから䜿甚しおポむンタヌに戻るなど、UBになるものもありたすが、それらは簡単に犁止されたす実行時/評䟡時に既にポむンタヌを远跡しおいるため、ポむンタヌ倉換ぞの䜿甚を犁止したす。

浮動小数点に぀いおは、NaN正芏化

私はそれらの䞡方が党䜓を決定論的にするだろうず思いたす。

これはおそらく、たずえばNaNペむロヌドのために、floatのビットを取埗するこずも問題であるこずを意味したす。

完党な参照透過性を埗るには、すべおのフロヌト操䜜を危険にさらす必芁があるず思いたす。

浮動小数点の決定論は難しい

ここで最も重芁な点は、LLVMのオプティマむザヌは、フロヌト操䜜の順序を倉曎できるこずず、オペコヌドを組み合わせた操䜜を〜実行〜するこずです。 これらの倉曎は、実際の違いがわずかであっおも、操䜜の結果に圱響を䞎えたす。 miriはllvmに最適化されおいないmirを実行し、タヌゲットはllvmに最適化され、堎合によっおは䞊べ替えられ、したがっおネむティブコヌドずは異なるセマンティクスを実行するため、これは参照透過性に圱響したす。

参照透過性がどれほど重芁であるかが決定されるたで、フロヌトのない最初の安定したconst fn機胜に同意したすが、その議論によっおconstfnの速床が䜎䞋したりブロックされたりするこずは望たしくありたせん。

ここで最も重芁な点は、LLVMのオプティマむザヌは、フロヌト操䜜の順序を倉曎できるほか、オペコヌドを組み合わせたヒュヌズ操䜜を実行できるこずです。 これらの倉曎は、実際の違いがわずかであっおも、操䜜の結果に圱響を䞎えたす。

融合操䜜mul-addを参照しおいるず思いたすは、結果の䞞めを倉曎するため、高速挔算フラグなしでは蚱可されたせん/実行されたせん。 LLVMは、IEEE準拠のハヌドりェアを察象ずする堎合、「デフォルトの浮動小数点環境」によっお蚭定された制限内で、浮動小数点挔算の正確なセマンティクスを維持するように现心の泚意を払っおいたす。

LLVMが保持しようずしない2぀のこずは、NaNペむロヌドずNaNのシグナリング性です。これらは䞡方ずも、デフォルトのfp環境では芳察できないため、フロヌトのビットを怜査するだけで、犁止する必芁がありたす。 そしお、LLVMがそれらにもっず泚意を払っおいたずしおも、ハヌドりェアはNaNペむロヌドの凊理も異なるため、これをLLVMに固定するこずはできたせん。

コンパむラの決定が浮動小数点の結果に圱響を䞎える可胜性があるこずを私が知っおいる他の䞻芁なケヌスは、 x87 pre-SSEコヌドでのスピルずリロヌドの堎所です。 x87はデフォルトで䞭間結果の堎合は80ビットに䞞められ、ストアの堎合は32ビットたたは64ビットに䞞められるため、これは䞻に問題です。 正しく䞞められた結果を達成するために、各FPU呜什の前に䞞めモヌドを適切に蚭定するこずは可胜ですが、実際には実甚的ではないため、LLVMはそれをサポヌトしおいたせん。

完党な参照透過性に぀いお

私の芋解では、完党な参照透過性を䜿甚する必芁がありたす。これは、安党性/利䟿性/完党性よりも正確性を遞択するずいう党䜓的なRustメッセヌゞず䞀臎するためです。

参照透過性は、等匏掚論を可胜にするなど、倚くの掚論の利点を远加したすボトムたでですが、速くお緩い掚論は道埳的に正しいです。

ただし、もちろん欠点もありたす。 完党性を倱う。 CTFE。 ぀たり、参照透過性のconst fnメカニズムは、コンパむル時に、非参照透過性のconst fnスキヌムほど評䟡できないずいうこずです。 参照透過性に固執しないこずを提案するものから、トレヌドオフを評䟡できるように、この提案に察しお可胜な限り具䜓的なナヌスケヌスを提䟛するようお願いしたす。

さお、あなたはLLVMポむントに぀いお正しいようです。高速数孊モヌドを有効にしない限り、蚈算䞊間違った操䜜を実際に回避しおいるようです。

ただし、浮動小数点挔算が内郚粟床のように䟝存しおいるずいう状態はただたくさんありたす。 CTFEフロヌト゚バリュ゚ヌタヌは実行時の内郚粟床倀を知っおいたすか

たた、倀をメモリにスピルするずきに、内郚倀をieee754圢匏に倉換しお、粟床を倉曎したす。 これも結果に圱響を䞎える可胜性があり、コンパむラがスピルを実行するアルゎリズムは指定されおいたせんね。

@ est31コンパむル時ず実行時の動䜜が異なっおいおもかたわないず仮定しおいるこずに泚意しおください。繰り返しの呌び出しフリヌズされたオブゞェクトグラフを䜿甚は䞀貫しおおり、グロヌバルな副䜜甚はありたせん。

したがっお、参照透過性が本圓に必芁な堎合は、miriで問題がない堎合でも、少なくずも安党なコヌドでは実行時の非決定性を匕き起こす可胜性のあるものを蚱可しないようにする必芁がありたす。

したがっお、ここでの目暙は、少なくずもconst fnが完党に安党である堎合、実行䞭にmiriが゚ラヌになったずしおも、実行時にconst fnが決定論的で副䜜甚がないこずを保蚌するこずです。コヌド TBH、私はそれが重芁だずは思っおいたせんでした。 これはかなり匷力な芁件であり、実際、少なくずもptr-to-intずfloat-to-bitsを安党でなくする必芁がありたすが、これは説明が難しいでしょう。 OTOH、それから私達はたた生のポむンタヌ比范を危険にするべきであり、私はそれに぀いお満足しおいるでしょうD

これの動機は䜕ですか Rustがか぀お持っおいお倱ったものである、玔床ず゚フェクトシステムを再導入しようずしおいるようです。人々がそれを䜿いたいず思ったこずに぀いおは、https//mail.mozilla.org/pipermail/rust-dev/2013-April/003926.htmlを参照しおください。

ptr-to-intは、オブゞェクトの先頭から倉換する堎合は安党であり、int-to-ptrが倱敗するこずを蚱可したす。 それは100決定論的です。 そしお、すべおの呌び出しは同じ結果を生成したす。

ptr-to-intは安党ですが、int-to-ptrは安党ではありたせん。 ptr-to-intは、 const評䟡で「実行されおいない」結果を蚱可する必芁がありたす。

むンタプリタ/VMでは実際にNaN正芏化を䜿甚する必芁がありたす。 この䟋はLuaJITで、これによりすべおのNaN結果が正芏のNaNになり、他のすべおのNaNはパックされたNaNになりたす

ptr-to-intは、オブゞェクトの先頭から倉換する堎合は安党であり、int-to-ptrが倱敗するこずを蚱可したす。 それは100決定論的です。 そしお、すべおの呌び出しは同じ結果を生成したす。

実行時にこれを実装するこずをどのように提案したすか (&mut *Box::new(...)) as usizeは珟圚、非決定論的関数であり、すべおconst fnである必芁がありたす。 では、垞に同じ倀を返すずいう意味で、「実行時に参照的にトランスペントされる」こずをどのように提案したすか

Box :: newは、VM内の远跡されたポむンタヌを返す必芁がありたす。

倉換の結果、コンパむル時぀たり、const評䟡で0になりたす。 非定数評䟡では、䜕でも返されたす。

远跡されたポむンタは次のように機胜したす。

ポむンタを割り圓お、それを割り圓おたす。 割り圓おるず、VMはポむンタ倀を0に蚭定したすが、ポむンタのメモリアドレスを取埗し、ルックアップテヌブルにアタッチしたす。 ポむンタを䜿甚するずきは、ルックアップテヌブルを調べたす。 ポむンタの倀぀たり、それを構成するバむトを取埗するず、0が取埗されたす。これがオブゞェクトのベヌスポむンタであるず想定したす。

Box :: newは、VM内の远跡されたポむンタヌを返す必芁がありたす。

ここでは、実行時の動䜜に぀いお説明しおいたす。 のように、これがバむナリで実行されるずどうなりたすか。 VMはありたせん。

miriは、これらすべおをすでに問題なく、完党に決定論的に凊理できたす。


たた、 const fnずランタむム決定に぀いおの懞念に戻りたすそれが必芁な堎合私たちがそうするかどうかはわかりたせんが、なぜ私たちが気にするのか説明するのを埅っおいたすD、宣蚀するこずができたすptr-to-intおよびfloat-to-bitsは、非定数挔算になりたす。 䜕か問題はありたすか

@RalfJung私はhttps://github.com/rust-lang/rust/issues/49146#issuecomment-386727325をリンクしたしたが、他のメッセヌゞで倱われた可胜性がありたす- @Centrilが提案した゜リュヌションの説明が含たれおいたす操䜜をunsafeにし、いく぀かの「正しい䜿甚法」をホワむトリストに登録したす。たずえば、ptr-to-intおよびNaNで正芏化されたfloat-to-bitsの堎合はoffset_of 。

@eddyb確かに、さたざたな解決策がありたす。 私が求めおいるのはモチベヌションです。 あそこにも芋぀かりたせんでした。

たた、IRCからの匕甚ptrからintぞのキャストが蚱可されおいる堎合でも、CTFEは決定論的であるず正圓に䞻匵できるず思いたす。 非決定論を実際に芳察するには、非CTFEコヌドたずえば、intにキャストされたptrのビットを抜出するが必芁です。

const fn thing() -> usize {
    (*Box::new(0)) as *const _ as usize
}

const X: usize = thing();
const Y: usize = thing();

X == Yですか

私の提案では、X==Yです。

@ SoniEx2はfoo as *const _ as usize as *const _を壊したすが、これは今のずころ完党にヌヌプです

Wrtの動機
個人的には、実行時の動䜜がコンパむル時の動䜜ず異なる問題や、constfnが実行時に非決定的であるずいう問題は芋られたせん。 ここでは安党性は問題ではないので、安党でないずいうのは完党に間違ったキヌワヌドimoです。 これは、コンパむル時の評䟡で完党にキャッチしおいる驚くべき動䜜です。 あなたはすでに通垞の機胜でこれを行うこずができるので、そこに驚くこずはありたせん。 Const fnは、実行時に圱響を䞎えるこずなく、コンパむル時に既存の関数を評䟡可胜ずしおマヌクするこずを目的ずしおいたす。 それは玔粋さに぀いおではありたせん、少なくずもそれはpplが「玔粋な地獄」に぀いお話すずきに私が埗た雰囲気です私は呚りにいなかったので、私は誀解しおいるかもしれたせん

@ SoniEx2はい、垞にX == Yです。

ただし、次の堎合

const fn oracle() -> bool { let x = 0; let y = &x as *const _ as usize; even(y) }

fn main() {
    assert_eq!(oracle(), oracle());
}

その堎合、 mainは実行時にパニックになる可胜性がありたす。

@RalfJung

たたは、人々がそれを䜿甚したいず思っおいたさたざたなこずをすべお実行するのに十分な柔軟性がなかったためです[..]

それらは䜕でしたか これを具䜓的に評䟡するこずは困難です。

ptrからintぞのキャストが蚱可されおいる堎合でも、CTFEは決定論的であるず正圓に䞻匵するこずさえできるず思いたす。
[...]
非決定論を実際に芳察するには、非CTFEコヌドたずえば、intにキャストされたptrのビットを抜出するが必芁です。

はい、 const fnはコンパむル時に実行された堎合でも決定論的ですが、 const fn以倖の倀 fnのみが垞に存圚するため、実行時に決定論的であるずは思いたせん。 const fnの結果が実行時に䜕かに圹立぀堎合は、そのfnコヌドは、実行されたconst fnからの副䜜甚を芳察したす。

Haskellの玔粋なコヌドず玔粋でないコヌドを区別する党䜓的なポむントは、グロヌバルに起こりうる副䜜甚に぀いお考える必芁がないロヌカルな決定を「副䜜甚があるべきか」ずいう決定を䞋せるこずです。 ぀たり、䞎えられた

reverse :: [a] -> [a]
reverse []       = []
reverse (x : xs) = reverse xs ++ [x]

putStrLn :: String -> IO ()
getLine :: IO String

main :: IO ()
main = do
    line <- getLine
    let revLine = reverse line
    putStrLn revLine

let revLine = reverse lineのrevLineの結果は、$ reverseに枡された状態 line にのみ䟝存するこずがわかりたす。 これにより、掚論のメリットずクリヌンな分離が実珟したす。

圓時の゚フェクトシステムはどのようなものだったのだろうか...それをきれいに実行しおコヌドを再利甚するには、ずにかくconst fn 、 async fnなどを指定したものが必芁だず思いたす䜕かhttps// github.com/rust-lang/rfcs/pull/2237ですが、いく぀かの倉曎がありたす...そしおパラメトリシティはそのための良いアむデアのようです。

PhilWadlerずConorMcBrideの䞍滅の蚀葉で

私は玔粋なのか、それずも䞍玔なのか
—フィリップ・ワドラヌ[60]

私たちは「はい」ず蚀いたす玔床は地元で䜜る遞択です

https://arxiv.org/pdf/1611.09259.pdf

@ oli-obk

実行時たたはコンパむル時に同じ匕数を指定しお実行するず、実行結果がconst fnで異なる可胜性があるずいう、この驚くべき動䜜を文曞化する必芁がある人をうらやたしく思いたせん。

保守的なオプションずしお、 const fnを参照透過性ずしお安定させ、 unsafe たたは非const に違反させるこずにより、参照透過性/玔床に関する決定を遅らせるこずを提案したす。ただし、実際には参照透過性を保蚌するものではないため、人々もそれを想定するこずはできたせん。

埌で経隓を積んだら、決断を䞋すこずができたす。
経隓を積むこずには、非決定論を利甚しようずしお倱敗した人々が含たれ、それを報告しお、圌らのナヌスケヌスに぀いお私たちに話したす。

はい、しかしそれはconst評䟡ではありたせん。

constでintをptrに倉換するこずは、倧きな損倱のようには芋えたせん。 フィヌルドオフセットを取埗するこずがより重芁であるように思われ、それが私が維持しようずしおいるこずです。

constを関数@ SoniEx2に远加するずきの動䜜を黙っお倉曎したくありたせん。これは、基本的にあなたの提案が行うこずです。

@centril同意したす、今は保守的なこずをしたしょう。 したがっお、これらを危険にさらすこずはありたせんが、䞍安定にしたす。 このようにしおlibstdはそれを䜿甚できたすが、埌で詳现を決定できたす。

私たちが抱えおいる問題の1぀は、ナヌザヌがナニオンを導入し、いく぀かの凝った倉換を行うこずで、い぀でも分析をブリックできるこずです。そのため、埌で倉曎できるように、このような回避倉換UBを䜜成する必芁がありたす。

それは実行時にただ同じであり、constはconst時にのみ倉曎を行いたすが、これは...constなしでは実行できたせん。

const fnsが、異なるポむンタ゚むリアシングルヌルを持぀サブ蚀語であるのは問題ありたせん。

@Centril @ est31クロロトリフルオロ゚チレンが䜕かず䜕の関係があるのか​​わかりたせん頭字語を定矩せずにたくさんの頭字語を䜿甚するこずを避けられたすか

@sgrif CTFEコンパむル時関数評䟡は、Rustに長い間䜿甚されおきたしたこのスレッドの䜕幎も前の郚分を含む。 これは、すでに䞭心的な堎所で定矩されおいる必芁がある甚語の1぀です。

@sgrif lol申し蚳ありたせんが、私は「圌らは今、どの奇劙な蚀葉を䜿っおいるのか」ず疑問に思っおいる人です。 圌が「CTFE」ず蚀ったずき、私はIRCの@eddybず話しおいたず思いたす。そしお、それが䜕を意味するのかを圌に尋ねなければなりたせんでしたp。

このペヌゞの@eddybctrl + f + CTFEは、それを定矩するものにはなりたせん。 いずれにせよ、私はほずんどの堎合、ここでの議論に参加するために人々に倚くの掘り䞋げを匷制したくないずいう仮定に基づいおいたす。 「これが䜕を意味するのかをすでに知っおいるはずです」はかなり排他的なIMOです。

@Centril @ est31ありがずうheart

だから...に぀いおの考え

私たちが抱えおいる問題の1぀は、ナヌザヌがナニオンを導入し、いく぀かの凝った倉換を行うこずで、い぀でも分析をブリックできるこずです。そのため、埌で倉曎できるように、このような回避倉換UBを䜜成する必芁がありたす。

したがっお、const fn内のナニオンフィヌルドアクセスも䞍安定である必芁がありたすか

このペヌゞのctrl+f + CTFEは、それを定矩するものにはなりたせん。

申し蚳ありたせんが、それが意味するのは、 Rustの蚭蚈ず開発での䜿甚は、この1.0より前の問題よりも前のこずです。
そのような甚語の䞭心的なドキュメントがあるはずですが、悲しいこずに、リファレンスの甚語集は本圓に䞍足しおいたす。
HRTBずNLLは、他の頭字語の2぀の䟋であり、新しいものですが、むンラむンでは説明されおいたせん。

議論を排他的にしたくはありたせんが、@ Centrilたたは@est31のどちらにも頭字語を最初から導入しおいないため、CTFEの定矩を䟝頌するのは公平ではないず思いたす。
悲しいこずに、GitHubで必ずしも機胜しない゜リュヌションがありたす。これは、ボットがトップレベルのコメントを䜜成しお曎新し続ける、䞀般的に䜿甚されるすべおの頭字語の拡匵リストを含む、特定のサブレディットで芋たものです。そのsubredditの議論に珟れたす。

たた、CTFEに関する2぀のりィキペディアの蚘事「クロロトリフルオロ゚チレン」ず「コンパむル時関数の実行」が最初の2぀の結果であるため、Googleのバブルにいるのかどうか知りたいです。 それでも、前者は「コンパむラ機胜に぀いおは、コンパむル時関数の実行を参照しおください」で始たりたす。

 CTFE wikiリンクを䞀番䞊に配眮したした。では、 const fn sに戻っおください。P

誰かがRTFEをrustcガむド甚語集に远加できたすか私はモバむルを䜿甚しおいたす

たた、最䜎限を安定させお、実際に倚くの人が遭遇するものを確認する必芁があるず思いたす。これは、constifおよびmatch匏を䜿甚した珟圚のアプロヌチになりたす。

@Centril

実行時たたはコンパむル時に同じ匕数を指定しお実行するず、const fnの実行結果が異なる可胜性があるずいう、この驚くべき動䜜を文曞化する必芁がある人をうらやたしく思いたせん。

䞊で曞いたevenは、ポむンタヌのビットを怜査するため、CTFE時に実行するず倱敗したす。 実際には、これはアラむメントのせいであるず決定論的に蚀うこずができたす。均䞀性テストがビット挔算で実行される堎合、「フルミリ」はそれを適切に実行したす。ただし、最䞋䜍バむト党䜓をテストしおいるず仮定したす。最埌のビット。
ここで説明しおいるのは、コンパむル時にむンタヌプリタヌ゚ラヌで゚ラヌが発生するが、実行時には成功する関数です。 違いは、関数が実行を完了するかどうかです。 それを説明するのは難しいずは思いたせん。

CTFEが結果で成功した堎合、関数の実行時バヌゞョンも同じ結果で成功するこずが保蚌されるべきであるこずに同意したす。 しかし、それは私たちがここで話しおいるこずよりもはるかに匱い保蚌ですよね

@ oli-obk

同意したす。今は保守的なこずをしたしょう。 したがっお、これらを危険にさらすこずはありたせんが、䞍安定にしたす。 このようにしおlibstdはそれを䜿甚できたすが、埌で詳现を決定できたす。

私は文脈を倱いたした、ここで「これら」は䜕ですか

珟圚、幞いなこずに、CTFE miriは、ポむンタヌ倀算術、比范、すべおの゚ラヌを䜿甚しお䜕もするこずを完党に拒吊しおいたす。 これは、蚈算で実際に䜿甚される倀に基づいおCTFE時に実行されるチェックであり、ナニオンによっお回避するこずはできたせん。ずにかく、算術/比范を実行するために必芁なコヌドは存圚したせん。 したがっお、私は䞊蚘の保蚌を満たしおいるず確信しおいたす。

CTFEがポむンタヌ倀を返すようにするず問題が発生する可胜性がありたすが、コンパむル時に蚈算されたポむンタヌ倀はどこでも意味がありたすか ポむンタ倀をビットに倉換する必芁があるため、miriが蚈算するポむンタ倀が含たれおいないこずをすでに確認しおいるず思いたすか

CTFE miriに操䜜を泚意深く远加するこずができたす。実際、 @eddybのoffset_of[1]に必芁なのは、ポむンタヌの枛算だけです。 そのコヌドは「fullmiri」に存圚し、䞡方のポむンタヌが同じ割り圓お内にある堎合にのみ成功したす。これは、䞊蚘の保蚌を維持するのに十分です。 うたくいかないのは、 @eddybがセヌフガヌドずしお远加したassertです。
操䜜がポむンタヌの敎列された郚分にのみ圱響する堎合、ポむンタヌ倀のビット操䜜を蚱可するこずもできたす。これはただ決定論的であり、コヌドは実際には「フルミリ」にすでに存圚したす。

線集[1]参考たでに、このスレッドで圌のマクロを参照しおいたすが、トピック倖ずマヌクされおいるためリンクできたせん。そのため、コピヌを次に瀺したす。

macro_rules! offset_of {
    ($Struct:path, $field:ident) => ({
        // Using a separate function to minimize unhygienic hazards
        // (e.g. unsafety of #[repr(packed)] field borrows).
        // Uncomment `const` when `const fn`s can juggle pointers.
        /*const*/ fn offset() -> usize {
            let u = $crate::mem::MaybeUninit::<$Struct>::uninit();
            // Use pattern-matching to avoid accidentally going through Deref.
            let &$Struct { $field: ref f, .. } = unsafe { &*u.as_ptr() };
            let o = (f as *const _ as usize).wrapping_sub(&u as *const _ as usize);
            // Triple check that we are within `u` still.
            assert!((0..=$crate::mem::size_of_val(&u)).contains(&o));
            o
        }
        offset()
    })
}

EDIT2実際、圌はそれもここに投皿したした。

「これら」はfloat->ビット倉換ずポむンタ->usize倉換です

CTFEが結果で成功した堎合、関数の実行時バヌゞョンも同じ結果で成功するこずが保蚌されるべきであるこずに同意したす。 しかし、それは私たちがここで話しおいるこずよりもはるかに匱い保蚌ですよね

したがっお、実行時に匕数を䜿甚しお呌び出された関数は、コンパむル時に同じ匕数を䜿甚しお評䟡された堎合に実際に終了した堎合にのみ、玔床が保蚌されたすか

それは私たちの生掻を䜕癟䞇倍も楜にしおくれるでしょう。特に、抜け穎を残したり、const fnを壊滅的な方法で壊したりせずに、非決定性を防ぐ方法が芋圓たらないからです。

したがっお、実行時に匕数を䜿甚しお呌び出された関数は、コンパむル時に同じ匕数を䜿甚しお評䟡された堎合に実際に終了した堎合にのみ、玔床が保蚌されたすか

はい、それが私が提案しおいるこずです。


もう少し考えおみるずそしお私がこれを曞いおいる間に珟れた@ oli-obkの返信を読んで、あなたが望むのは「安党なconst fnぱラヌにならない」ずいう線に沿った远加の保蚌であるず感じたす有効な匕数で呌び出された堎合のCTFE時間パニック以倖」。 ある皮の「䞀定の安党性」の保蚌。 実行時の動䜜ず䞀臎するCTFEの成功に぀いお前述した保蚌ずずもに、安党なconst fnは、成功したCTFEの実行ず䞀臎するため、実行時に決定論的であるずいう保蚌を提䟛したす。

私はそれが取埗するのが難しい保蚌であるこずに同意したす。 良くも悪くも、Rustには、決定論を維持しながらCTFE miriが垞に正垞に実行されるこずを保蚌できないさたざたな安党な操䜜がありたす。たずえば、最䞋䜍バむトが0であるかどうかをテストする@Centrilのoracleのバリアントなどです。この蚭定でのCTFEの堎合、「タむプusizeの有効な倀」は、 PrimVal::Bytesの倀のみを構成したすが、 PrimVal::Ptrは蚱可されたせん[1]。 constコンテキストでは、型システムが少し異なるようです。miriの機胜を倉曎するこずを提案しおいるのではなく、 const fnにアタッチされたずきにさたざたなRust型が「意味する」こずを倉曎するこずを提案しおいたす。 このような型システムは、CTFEですべおの安党な算術挔算ずビット挔算が倱敗しないこずを保蚌したす。CTFEが有効な入力の堎合、䞡偎がPrimVal::Bytesであるため、CTFEで敎数枛算が倱敗するこずはありたせん。 もちろん、ptr-to-intの戻り倀の型usizeですが、CTFEで有効なusizeではないため、この蚭定ではptr-to-intは安党でない操䜜である必芁がありたす。

これが私たちが気にかけおいる保蚌である堎合、CTFE関数をチェックするずきに型システムをより厳密にするこずは私には䞍合理に思えたせん。 結局のずころ、私たちはそれをもっず倚くのこずをするために䜿いたいのです「䞀定の安党性」をチェックする。 それなら、ptr-to-intキャストを$ constコンテキストでunsafeず宣蚀するこずは非垞に理にかなっおいるず思いたす。これは、 constコンテキストが远加の保蚌。

私たちの通垞の「実行時の安党性」が安党でないコヌドによっお砎壊される可胜性があるのず同じように、「䞀定の安党性」も砎壊される可胜性があり、それは問題ありたせん。 安党でないコヌドがナニオンを介しおptrからintぞのキャストを実行できるこずに問題はありたせん。結局のずころ、これは安党でないコヌドです。 この䞖界では、constコンテキストでの安党でないコヌドの蚌明矩務は、非constコンテキストでの蚌明矩務よりも匷力です。 関数が敎数を返す堎合、これが垞にPrimVal::Bytesであり、決しおPrimVal::Ptrではないこずを蚌明する必芁がありたす。

@eddybのマクロには安党でないブロックが必芁ですが、これらの「const unsafe features」ptr-to-usizeしおから結果を枛算するか、たたはポむンタヌ枛算組み蟌みを䜿甚するのみを䜿甚するため、安党に䜿甚できたす。盎接CTFE゚ラヌを発生させないこずが保蚌されおいる方法で。

このようなシステムのコストは、安党な高次のconst fnがconst fnのクロヌゞャヌを取埗しお、クロヌゞャヌの実行自䜓が「定数の安党性」に違反しないこずを保蚌できるようにする必芁があるこずです。 これは、安党なconst fnに぀いお実際に適切な保蚌を取埗するための䟡栌です。

[1]非決定論がどこで発生するかに぀いおはよくわからないため、ここではフロヌトを完党に無芖しおいたす。 CTFE時ず実行時で動䜜が異なる浮動小数点コヌドの䟋を誰かが提䟛できたすか たずえば、浮動小数点挔算を実行するずきに、オペランドの1぀がシグナリングNaN最初の保蚌を取埗するため、前の投皿からのものである堎合は、miri゚ラヌを䜜成し、CTFE型システムず蚀うだけで十分でしょうか。タむプf32 / f64でのNaNのシグナリングを蚱可したせんか「䞀定の安党性」を取埗するため

うたくいかないのは、 @eddybがセヌフガヌドずしお远加したずいう䞻匵です。

もちろんですが、今のずころassert!(condition);を[()][!condition as usize];に曞き換えるこずができたす。

もちろんですが、assertcondition;を曞き換えるこずができたす。 to [] [condition as usize]; 今のずころ。

それは私が考えおいた䞻匵ではなく、あなたの状態でのポむンタヌ同等性テストです。 ポむンタヌの平等は悪であり、CTFEでそれを蚱可できなかった堎合は私が望んでいたす。

線集気にしないでください、私はassertがオフセットをテストするこずに気づきたした。 したがっお、実際には、CTFE時に倱敗するこずはありたせん。これは、 wrapping_subを実行するずきにポむンタヌが同じブロックにない堎合、miriが゚ラヌになるためです。

// guess we can't have this as const fn
fn is_eq<T>(a: &T, b: &T) -> bool {
    a as *const _ == b as *const _
}

前に蚀ったように、実際のポむンタヌではなく、ミリで仮想ポむンタヌを䜿甚したす。 const時にconst決定論を提䟛できたす。 関数が正しく蚘述されおいる堎合、実行時ずコンパむル時の動䜜は、実行時が非決定的であるかどうかに関係なく、コンパむル時が決定論的であるにもかかわらず、同じ結果を生成するはずです。 コヌディングすれば、非決定論的環境で決定論的動䜜をずるこずができたす。

フィヌルドオフセットを取埗するこずは決定論的です。 仮想ポむンタを䜿甚するず、決定論的なたたになりたす。 実際のポむンタを䜿甚しおも、それはただ決定論的です。

ポむンタの14番目のビットの均䞀性を取埗するこずは決定論的ではありたせん。 仮想ポむンタを䜿甚するず、決定論的になりたす。 実際のポむンタでは、決定論的ではありたせん。 1぀はコンパむル時に発生し決定論的環境、もう1぀は実行時に発生する非決定論的環境ため、これは問題ありたせん。

const fnは、䜿甚されおいる環境ず同じくらい決定論的である必芁がありたす。

@ SoniEx2

// guess we can't have this as const fn

確かにできたせん。 割り圓おられたオブゞェクト内にあるずいう意味で、どちらかのポむンタヌが珟圚参照解陀できない堎合に゚ラヌが発生するバヌゞョンのrawポむンタヌ比范を䜿甚できるず思いたすただし、これは「フルミリ」が珟圚実装しおいるものではありたせん。 ただし、それでもis_eqは「constsafe」ではありたせん。 Tのサむズがれロの堎合、安党なコヌドのみを考慮しおも、オブゞェクトの終わりの1぀先を指す可胜性があるためです。

C ++では、ポむンタヌを最埌から1぀比范しお、䞍確定な非確定的な結果を生成できたす。 CずC++はどちらも、ダングリングポむンタヌを比范しお、䞍確定な結果を生成するこずができたす。 LLVMが䜕を保蚌するかは明確ではありたせんが、C / C ++に察しお保蚌する必芁があるもの異なる堎合は2぀のうち匱い方を超える保蚌には賭けたくありたせん。 これは、CTFEで正垞に実行されるすべおの実行時の決定論を保蚌したい堎合に問題になりたす。これは、私たちが行っおいるず思いたす。

@RalfJung

違いは、関数が実行を完了するかどうかです。

悪魔の䞻匵ある堎合の「戻る⊥」は、結果が異なるのず同じです。

それを説明するのは難しいずは思いたせん。

個人的に私はそれを驚くべき行動だず考えおいたす。 あなたはそれを説明するこずができたす、そしお私は理解するかもしれたせんしかし私は代衚ではありたせん...、しかしそれは私の盎感に合いたせん。

@ oli-obk

したがっお、実行時に匕数を䜿甚しお呌び出された関数は、コンパむル時に同じ匕数を䜿甚しお評䟡された堎合に実際に終了した堎合にのみ、玔床が保蚌されたすか

個人的には、この保蚌は十分ではないず思いたす。 最初に、玔粋さでどこたで到達できるかを確認する必芁がありたす。実際に問題が発生しおいるこずがわかった堎合にのみ、より匱い保蚌に移行する必芁がありたす。

@RalfJung

これにより、CTFEの実行の成功ず䞀臎するため、安党なconstfnが実行時に決定論的であるこずが保蚌されたす。

わかった; あなたは私を倱った。 2぀の前提を考えるず、この「安党な定数fnは決定論的」保蚌にどのように到達したのかわかりたせん。 理由を詳しく教えおいただけたすか

これが私たちが気にかけおいる保蚌である堎合、CTFE関数をチェックするずきに型システムをより厳密にするこずは私には䞍合理に思えたせん。 結局のずころ、私たちはそれをもっず倚くのこずをするために䜿いたいのです「䞀定の安党性」をチェックする。 したがっお、constコンテキストでは远加の保蚌が行われるため、これが必芁であるず䞻匵しお、ptr-to-intキャストをconstコンテキストで安党でないず宣蚀するこずは非垞に理にかなっおいるず思いたす。

私たちの通垞の「実行時の安党性」が安党でないコヌドによっお砎壊される可胜性があるのず同じように、「䞀定の安党性」も砎壊される可胜性があり、それは問題ありたせん。 安党でないコヌドがナニオンを介しおptrからintぞのキャストを実行できるこずに問題はありたせん。結局のずころ、これは安党でないコヌドです。 この䞖界では、constコンテキストでの安党でないコヌドの蚌明矩務は、非constコンテキストでの蚌明矩務よりも匷力です。 関数が敎数を返す堎合、これが垞にPrimVal::Bytesであり、決しおPrimVal::Ptrではないこずを蚌明する必芁がありたす。

これらの段萜は私の耳に聞こえる音楜です ❀これは決定論「玔床」を保蚌するように芋えたすか たさに私が以前に考えおいたものです。 constの安党性も玠晎らしい甚語だず思いたす

将来の参考のために、この保蚌を「CTFEの健党性」ず呌びたしょう。CTFEに゚ラヌがない堎合、その動䜜は実行時に䞀臎したす。䞡方が発散するか、䞡方が同じ倀で終了したす。 ここでは、高次の戻り倀を完党に無芖しおいたす。

@Centril

悪魔の䞻匵ある堎合の「戻る⊥」は、結果が異なるのず同じです。

たあ、それは明らかに定矩の問題です。 あなたは私が説明したCTFE健党性保蚌を理解したず思いたす、そしおあなたはそれが私たちが望む保蚌であるこずに同意したす。 それが私たちが望むすべおであるかどうかは議論の䜙地がありたす:)

わかった; あなたは私を倱った。 2぀の前提を考えるず、この「安党な定数fnは決定論的」保蚌にどのように到達したのかわかりたせん。 理由を詳しく教えおいただけたすか

foo(x)を呌び出したずしたす。ここで、 fooは安党なconst関数であり、 xはconst-valid倀です぀たり、 &y as *const _ as usizeではありたせん。 。 次に、constの安党性により、 foo(x)が゚ラヌを発生させるこずなくCTFEで実行されるこずがわかりたす。 結果ずしお、CTFEの健党性により、実行時にfoo(x)はCTFEの堎合ず同じように動䜜したす。

基本的に、私はあなたの保蚌を2぀の郚分に分解したず思いたす-1぀は、安党なconst fnがCTFEがサポヌトしおいないこずstdinからの読み取り、ポむンタヌの最䞋䜍バむトが0かどうかの刀断などを決しお詊みないこずを保蚌したす。 1぀は、CTFEがサポヌトするものがすべおランタむムず䞀臎するこずを保蚌するものです。

これらの段萜は私の耳に聞こえる音楜です 心これは決定論「玔床」を確実にするように芋えたすか たさに私が以前に考えおいたものです。 constの安党性も玠晎らしい甚語だず思いたす

よろしくお願いしたす。 :)これは、私たちがここで話しおいるこずをようやく理解したこずを意味したす。 「玔床」ずは色々な意味がありたすので、少し䞍安を感じるこずがよくありたす。 たた、決定論はconstの安党性にずっお十分な条件ではありたせん。関連する基準は、CTFEでの実行で゚ラヌが発生するかどうかです。 deterministc non-const-safe関数の1぀の䟋は、 orcaleに0を掛けたものです。これは、ポむンタヌのバむトを怜査するずきにmiriが゚ラヌになるため、安党でないコヌドを䜿甚しおも問題ありたせん。最終的にバむトが重芁ではない堎合でも、ポむンタの最䞋䜍バむトを抜出する操䜜は「const-UB」であるため、安党でないconstコヌドでも蚱可されたせん。

はい、配列芁玠の終わりを1぀超えたポむンタは、おそらく次の配列芁玠を指したす。 だから䜕 それは本圓に非決定論的ではありたせんか ずにかく重芁なのは、コンパむル時の決定論です。 私の知る限り、ランタむム評䟡はスタックの枯枇をセグメンテヌション違反にする可胜性がありたす。

@RalfJung

このようなシステムのコストは、安党な高階const fnがconst fnクロヌゞャを取埗しお、クロヌゞャの実行自䜓が「constsafety」に違反しないこずを保蚌できるようにする必芁があるこずです。 これは、安党なconst fnに぀いお実際に適切な保蚌を取埗するための䟡栌です。

提䟛される関数が?const fn(T) -> Uである堎合にのみ、結果をconstにバむンドできる高階関数を蚘述できる、 ?constを導入するこずで、ほずんどの既存のコヌドの倉換をサポヌトするために、これを倧幅に軜枛できるず思いたす。 ?const fn(T) -> Uおよびここでis_const(x : T) ; だからあなたは持っおいたす

?const fn twice(fun: ?const fn(u8) -> u8) { fun(fun(42)) }

fn id_impure(x: u8) -> u8 { x }
const fn id_const(x: u8) -> u8 { x }
?const fn id_maybe_const(x: u8) -> u8 { x }

fn main() {
    let a = twice(id_impure); // OK!
    const b = twice(id_impure); // ERR!
    let c = twice(id_const); // OK!
    const d = twice(id_const); // OK!
    let e = twice(id_maybe_const); // OK!
    const f = twice(id_maybe_const); // OK!
}

私は1週間かそこらでこの効果およびそれ以䞊に䜕かを提案するRFCを曞きたす。

@Centrilこの時点で、゚フェクトポリモヌフィズムを備えた゚フェクトシステムを開発しおいたす。 それが垞にあなたの秘密の議題であったこずを私は知っおいたす、それが露骚に明癜になっおいるこずをあなたに知らせるだけです。^^

@RalfJung昚幎、https//github.com/rust-lang/rfcs/pull/2237で秘密を明かしたしたが、曞き盎さなければなりたせん;
今ではほずんどパブリックドメむンです^、-

@ SoniEx2

はい、配列芁玠の終わりを1぀超えたポむンタは、おそらく次の配列芁玠を指したす。 だから䜕 それは本圓に非決定論的ではありたせんか ずにかく重芁なのは、コンパむル時の決定論です。 私の知る限り、ランタむム評䟡はスタックの枯枇をセグメンテヌション違反にする可胜性がありたす。

問題は、次のような状況にありたすC ++の堎合。

int x[2];
int y; // let's assume y is put right after the end of x in the stack frame
if (&x[0] + 2 == &y) {
  // ...
}

Cコンパむラは、その比范をfalseに最適化するこずを望んでいたすそしおそうしたす。 結局のずころ、1぀のポむンタヌはxを指し、もう1぀はyを指しおいるため、これらが等しくなるこずはあり埗たせん。
もちろん、1぀のポむンタがxの終わりを指しおいるため、アドレスがマシン䞊で等しいこずを陀いお、これはyず同じアドレスです したがっお、アドレスがどこから来たのかをコンパむラヌが認識できないようにコヌドを十分に䞍明瞭にするず、比范がtrueず評䟡されるこずがわかりたす。 したがっお、C ++暙準では、䞡方の結果を非決定的に発生させるこずができ、最適化 false ずアセンブリぞのコンパむル true の䞡方が正圓化されたす。 C暙準ではこれが蚱可されおいないため、LLVMおよびGCCは䞡方ずもこれらの皮類の最適化を実行するため、コンパむラヌは䞍適合になりたす。

私は、このスレッドおよび/たたはIRCに関する関連する議論でここに出おきたconstの安党性、constの健党性などの私の考えの芁玄を曞きたした https //www.ralfj.de/blog/2018/07/19/

ここでのこの問題は、非垞に倚くのこずが議論されおいるため、解きほぐすのがやや困難になっおいたす。 @ oli-obkは、const-evalの懞念事項のリポゞトリを䜜成したので、特定のサブ問題に぀いお話し合うのに適した堎所は、おそらくhttps://github.com/rust-rfcs/const-evalの問題远跡システムです。

@Centrilは、将来の拡匵機胜ず䞊䜍互換性のある最小バヌゞョンを安定させるこずを提案したした。

  • 特性の境界を持぀䞀般的な匕数はありたせん
  • fnポむンタたたはdyn Trait型の匕数たたは戻り型はありたせん

    • 匕数タむプを再垰的にチェックするため、匕数のフィヌルドもこれらのタむプではない可胜性がありたす

  • 安党でないコヌドはありたせん問題のあるものがあるかどうかわからないため

    • 個人的には、远加の機胜ゲヌトの背埌にすでにあるunionず、生のポむンタヌの参照解陀珟圚は䞀般的に犁止されおいたすを陀いお、これで問題ないず思いたす。 その他の安党でないコヌドは、他の安党でないconst fnsたたはconst組み蟌み関数を通過する必芁があり、安定化に関する独自の議論が必芁です。

nit私の提案には、 fnポむンタヌたたは$ const fn dyn Traitの再垰チェックも含たれおいたした

特性の境界を持぀䞀般的な匕数はありたせん

明確にするために、このようなものは受け入れられるかどうか

struct Mutex<T> where T: Send { /* .. */ }

impl<T> Mutex<T> where T: Send {
    pub const fn new(val: T) -> Self { /* .. */ }
}

境界はconst fn自䜓の䞀郚ではありたせん。

たた、明確にするためにそれらを安定させお残りを機胜ゲヌトの埌ろに残すずいう提案ですか、それずもそれらを安定させお残りを完党に゚ラヌにする提案ですか

@mark-im残りは機胜ゲヌトの埌ろに留たりたす。

@ oli-obk安党でないコヌドの問題は䜕ですか const X : Ty = ...で安党でないこずを蚱可したすが、これにはすべお同じ問題がありたす。 const fnの本文は、 constの本文ずたったく同じようにチェックする必芁があるず思いたす。

「unconst」操䜜安党であるがconst-safeではない操䜜基本的にはrawポむンタヌのすべおに぀いおは保守的であり続けたいず思いたすが、これらはconstコンテキストではすでに完党に蚱可されおいたせん。

境界は、constfn自䜓の䞀郚ではありたせん。

いいえ、その提案ではimplブロックの境界も蚱可されたせん

安党でないコヌドの問題は䜕ですか

コメントに蚘茉されおいるような問題は芋られたせん。 すべおのconstの安党でない機胜/機胜は、ずにかく独自の安定化を経る必芁がありたす。

@RalfJung問題は、 「 @ Centrilは、䜕かを芋逃したこずに神経質になっおいる。これらは、constコンテキストではすでに完党に蚱可されおいない」ず思いたす。 ;しかし、ある時点でunsafe { .. }をconst fnで安定させる必芁があるので、問題がなく、すべおのunconst操䜜をキャッチした堎合は、それを実行したしょう。

さらに、私たちが䜕かを逃した堎合、人々がconstでそれを䜿甚できるので、私たちはすでに䞀皮の困惑しおいたす。

私はただconstfnRFCリポゞトリのconst安党/プロモヌション郚分に蚘入するPRを曞く予定です。 それは、私たちがすべおをカバヌしたかどうかそしおテストケヌスを持っおいるかどうかを泚意深くチェックする時です。

Discordで思い぀いたもう1぀のこずは、FP操䜜です。珟圚、実際のハヌドりェアず䞀臎するこずを保蚌するこずはできたせん。 CTFEはIEEEに正確に準拠したすが、LLVM/ハヌドりェアは準拠しない堎合がありたす。

これはconstアむテムにも圓おはたりたすが、実行時に実行されるこずはありたせん。 const fnは実行される可胜性がありたす。 したがっお、 const fnでFP操䜜を安定させないのが賢明なようです。

OTOH、私たちはすでにFP運甚の結果を宣䌝しおいたすか したがっお、stableで芳察可胜な実行時/コンパむル時の䞍䞀臎はすでにありたす。 それを元に戻すこずができるかどうかを確認するためにクレヌタヌを実行する䟡倀がありたすか

今埌の参考のために、次の蚘事は浮動小数点ず決定論に関連しおいたす。

@RalfJung

それを元に戻すこずができるかどうかを確認するためにクレヌタヌを実行する䟡倀がありたすか

これができたら驚きたすが、少なくずも詊しおみる䟡倀はありたす。 :)

@RalfJungこのスレッドのさらに䞊に興味深い入力があるかもしれたせんhttps://github.com/rust-lang/rust/issues/24111#issuecomment-386764565

キヌワヌド圢匏をconst fnのたたにしおおきたいずするず、今䜕かを安定させるこずは、十分に制限されおいるので、かなりたずもな解決策だず思いたす以前はどうしお芋なかったのですか

これらの断片的な安定化を行うずき、私はただ登録したいだけです
制限ずその正圓化の明確なリストを芁求したす。 これは
ナヌザヌが䞀芋無害な倉曎を加えおむラむラする
コンパむル゚ラヌが発生するので、少なくずも゚ラヌを適切にするこずができたす。 私
掚論が倚くの議論に広がっおいるこずを認識したすが、そのすべおではありたせん
私はフォロヌしたしたが、ドキュメントたたは
参照、たたは少なくずもノミコン蚱可されおいない各操䜜をリストしたす。
それが匕き起こす可胜性のある問題、および安定化の芋通し䟋「決しお」、
「RFCXYZが実装されおいる堎合」、「仕様のこの郚分を特定した埌」。

2018幎8月20日月曜日午埌1時44分Eduard-MihaiBurtescu<
[email protected]>は次のように曞いおいたす

キヌワヌド圢匏をconstfnのたたにしおおきたいずするず、安定しおいるず思いたす
十分に制限されおいる今の䜕かは、かなりたずもな解決策ですどのように
今たで芋たこずがなかったの

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/rust-lang/rust/issues/24111#issuecomment-414403036 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAC3n80yVxIa3agsJP4wXZFkgyHVmAsjks5uSvWXgaJpZM4D66IA
。

@ est31 @rkruppeがすでに曞いたように、これらのヒュヌズは-ffast-mathなしで実行するのは違法であり、LLVMはそれを正しく凊理するず思いたす。

私が芚えおいるこずから、基本的な算術はそれほど問題ではありたせんが32ビットx86を陀いおx87 ...、超越関数は問題がありたす。 そしお、それらはconst fnではありたせんよね ですから、最終的には、この点でもconstのアむテム、プロモヌション、 const fnの間で同等になるこずを願っおいたす。

@RalfJungたずえば、こがしおから、いく぀かの操䜜の間にFPUレゞスタにロヌドしお戻すず、こがさずに同じ蚈算ず同じ結果が埗られるずはただ確信しおいたせん。

私が芚えおいるこずから、基本的な算術はそれほど問題ではありたせんが32ビットx86を陀いおx87 ...、超越関数は問題がありたす。

超越関数はどのように問題を意味したすか

IIRC、䞀郚の超越関数は䞀般的なx86プロセッサでサポヌトされおいたすが、これらの関数は䜎速で回避されおおり、完党性ず既存の実装ずの互換性のためにのみ含たれおいたす。 したがっお、ほずんどすべおの堎所で、超越関数は基本的な算術関数の組み合わせで衚珟されたす。 これは、それらの参照透過性ず算術関数の参照透過性に違いがないこずを意味したす。 基本的な機胜が「安党」である堎合、超越関数を含め、それらに基づいお構築されたものはすべおです。 ここでの「参照の䞍透明性」の唯䞀の原因は、これらの基本的な算術関数に関するこれらの超越関数の異なる近䌌実装である可胜性がありたす。 それが問題の原因ですか

@ est31ほずんどの超越関数は、最終的にはプリミティブ敎数ず浮動小数点挔算で構成される単なるラむブラリコヌドですが、これらの実装は暙準化されおおらず、実際には、Rustプログラムは、その存続期間を通じおおそらく3぀の異なる実装ず察話でき、その䞀郚はホストたたはタヌゲットによっおも異なりたす。プラットホヌム

  • プログラムがタヌゲットで䜿甚するランタむム実装がありたすたずえば、タヌゲットプラットフォヌムのlibm、たたは状況によっおはハヌドりェア呜什
  • LLVMが䜿甚する定数フォルダヌがありたす明らかにこれは単なるホストプラットフォヌムC libmです
  • MIRIがこれらの操䜜で行うこずは䜕でもありたすたずえば、 rustc_apfloatの䜕か、たたはhttps://github.com/japaric/libm/などのRust実装の解釈

これらのいずれかが互いに䞀臎しない堎合、匏が評䟡されるタむミングに応じお異なる結果を埗るこずができたす。

@rfcbotキャンセル

近い将来、フルモンティが安定する可胜性は䜎いです。
代わりに、短期的に安定できるこずを願っお、より最小限のサブセットhttps://github.com/rust-lang/rust/issues/24111#issuecomment-414310119で倧たかに抂説されおいるのコンセンサスを䜜成したいず思いたす。 。
このサブセットは53555で远跡されたす。 詳现に぀いおは、こちらをご芧ください。

@Centrilの提案はキャンセルされたした。

@rkruppe超越関数をllvm組み蟌み関数に䞋げる理由はありたすか 私たちが管理し、すべおのプラットフォヌムで同じである、よく知られた、錆びない実装にそれらを䞋げるこずによっお、問題党䜓を回避するこずはできたせんか

超越関数をllvm組み蟌み関数に䞋げる理由はありたすか

クロスプラットフォヌムlibm党䜓を実装しないずいう単玔さに加えお、組み蟌み関数には、通垞のラむブラリ関数では埗られないLLVMのオプティマむザヌずcodegenの利点がありたす。 明らかに、定数畳み蟌みおよび倀の範囲分析などの関連するものはこのコンテキストでは問題ですが、それ以倖の堎合は非垞に䟿利です。 代数的IDもありたすSimplifyLibCallsパスによっお適甚されたす。 最埌に、いく぀かの関数䞻にsqrtずその逆数であり、超越的ではありたせんが、䜕でもは、SSEを䜿甚しおx86でsqrtssを生成するための特別なコヌド生成をサポヌトしおいたす。

私たちが管理し、すべおのプラットフォヌムで同じである、よく知られた、錆びない実装にそれらを䞋げるこずによっお、問題党䜓を回避するこずはできたせんか

䞊蚘のすべおを無芖しおも、これは優れたオプションIMOではありたせん。 タヌゲットプラットフォヌムにClibmがある堎合、それがより最適化されおいるか、肥倧化を回避するために、それを䜿甚できるはずです。

組み蟌み関数は、LLVMのオプティマむザヌずcodegenで、通垞のラむブラリ関数では埗られない利点がありたす。

このような最適化は、高速蚈算がオンになっおいる堎合にのみ有効になるず思いたしたか

タヌゲットプラットフォヌムにClibmがある堎合、それがより最適化されおいるか、肥倧化を回避するために、それを䜿甚できるはずです。

もちろん。 コンパむルされたバむナリたたはより小さなバむナリの速床の向䞊など、より重芁なものを優先しお、このかなりアカデミックなプロパティ参照透過性を亀換するオプションが垞にあるはずです。 たずえば、プラットフォヌムlibmを䜿甚するか、高速蚈算モヌドをオンにしたす。 それずも、私たちが氞遠に高速数孊モヌドを犁止すべきだず提案したすか

IMOは、少なくずも+ 、 -などを蚱可しおいる堎合は、constコンテキストでf32::sin()を犁止するべきではありたせん。このような犁止により、人々は朚枠を䜜成しお䜿甚する必芁がありたす。 const互換の実装を提䟛したす。

このような最適化は、高速蚈算がオンになっおいる堎合にのみ有効になるず思いたしたか

これらの関数の継続的な評䟡ずsqrtssの攟出は、正しく䞞めるこずができるため、-ffast-mathなしで簡単に正圓化できたす。

それずも、私たちが氞遠に高速数孊モヌドを犁止すべきだず提案したすか

私は䜕も瀺唆しおいたせんし、そのような資産が保蚌されるべきかどうかに぀いおの意芋atmもありたせん。 私は単に制玄を報告しおいたす。

const fnコンテキストでVecが原因で発生したICEの未解決の問題が芋぀かりたせんでした。

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2015&gist=508238a9f06fd85720307bf6cc227586

このために新しい問題を開く必芁がありたすか

@Voultapherええそれは新しいICEのように芋えたす。

了解したした55063を開きたした。

ナヌザヌがconst fnで泚釈を付けたずきに、コンパむラがコンパむル時のconstexprで関数を呌び出すこずができるかどうかをチェックできる堎合は、すべおの関数に察しお自動的にチェックを実行しおみたせんか 自動特性に䌌おいたす 本圓の悪圱響は考えられたせん。明らかな利点は、゚ラヌが発生しやすい人間の刀断に頌る必芁がないこずです。

䞻な欠点は、それが公開の詳现になるこずです。したがっお、実装
constを意図しおいない関数の倉曎が壊れおいたす。

たた、人間の刀断に頌る必芁はありたせん。 泚釈のない関数がconst fnになる可胜性があるこずを通知する、クリップのようなリントを䜜成できたす https ://github.com/rust-lang/rust-clippy/issues/2440

これは、ロヌカル倉数の可倉性を掚枬しない方法ず䌌おいたすが、代わりに、コンパむラにmutを远加たたは削陀する堎所を教えおもらいたす。

@remexre const fnは、むンタヌフェヌス仕様ずしお機胜したす。 私はこの機胜の现郚にあたり粟通しおいたせんそしおおそらくここに続くものはすでに考えられおいたすが、関数が誀っおconstずしお泚釈されおいるこずをコンパむラが䌝えるず考えるこずができる2぀のケヌスはそのような関数がパラメヌタずしお&mutを受け取る堎合、たたは他の非const関数を呌び出す堎合、コンパむルに倱敗したす。 したがっお、 const fnの実装を倉曎し、それらの制玄を砎るず、コンパむラヌは停止したす。 次に、a個別の関数にconst以倖のビットを実装するか、意図した倉曎である堎合はAPIを䞭断するかを遞択できたす。

私がただ議論しおいない別の䞭間点があり、明瀺的に蚭定されおいない堎合、このマヌカヌの反察ずある皮の「関数玔床掚論」を導入する可胜性がありたす。 次に、ドキュメントには実際のマヌカヌが衚瀺されたすが、 constの堎合、そのマヌカヌの安定性を保蚌しないこずに぀いおの譊告が衚瀺されたす。 問題は、これが怠惰になり、ほが毎回これを行うこずを奚励する可胜性があるこずですが、それはその目的ではありたせん。

const fnは出力を生成できる必芁がありたすか なぜ&mutを犁止する必芁があるのですか

@aledomu私のコメントは@AGaussmanに向けられたした。 私は、ラむブラリの䜜成者がconstではない関数を公開しおいる堎合に぀いお話しおいたすconst-nessはAPIの䞀郚であるこずが意図されおいないずいう点で。 constが掚枬された堎合、その関数を非constにするこずは重倧な倉曎になりたす。

@ SoniEx2 const fnは、コンパむル時に評䟡できる関数です。これは、玔粋関数の堎合にのみ圓おはたりたす。

@remexre APIの安定した郚分を意図しおいない堎合は、マヌクを付けないでください。

私がコメントした掚論ビットに぀いおは、それがクレヌトドキュメントで譊告の必芁性に぀いお蚀及した理由です。

違いは䜕ですか 絶察にありたせん

const fn add_1(x: &mut i32) { x += 1; }
let mut x = 0;
add_1(&mut x);
assert_eq!(x, 1);
x = 0;
add_1(&mut x);
assert_eq!(x, 1);

const fn added_1(x: i32) -> i32 { x + 1 }
let mut x = 0;
x = added_1(x);
assert_eq!(x, 1);
x = 0;
x = added_1(x);
assert_eq!(x, 1);

私は以䞋の察象ずなる問題を提出したした

  • フロヌティングポむント+定数 https //github.com/rust-lang/rust/issues/57241
  • パタヌンずの統合 https //github.com/rust-lang/rust/issues/57240

次の察象ずなる問題はすでに存圚したす。

  • パニック https //github.com/rust-lang/rust/issues/51999
  • ルヌプ https //github.com/rust-lang/rust/issues/52000
  • 制埡フロヌ https //github.com/rust-lang/rust/issues/49146
  • 生のポむンタヌの比范 https //github.com/rust-lang/rust/issues/53020
  • 生のポむンタヌの間接参照 https //github.com/rust-lang/rust/issues/51911
  • usizeキャストぞの生のポむンタヌ https //github.com/rust-lang/rust/issues/51910
  • ナニオンフィヌルドアクセス https //github.com/rust-lang/rust/issues/51909
  • 長期評䟡に関する譊告 https //github.com/rust-lang/rust/issues/49980
  • ゚ラヌを匕き起こさない定数䌝播 https //github.com/rust-lang/rust/issues/28238
  • &mut T参照ず借甚 https //github.com/rust-lang/rust/issues/57349

他の問題によっおただ远跡されおいない他の領域がある堎合は、それに぀いお議論する必芁がありたす。 constevalずconst fn 、私は人々が新しい問題を䜜るこずを提案したすそしおそれらの䞭でcc me + @ oli-obk。

これで、この問題の有甚性は終わりです。

私はすべおの詳现を念頭に眮いおいるわけではありたせんが、miriによっおサポヌトされおいるが、 min_const_fnでただ有効になっおいないものは他にたくさんありたせんか たずえば、生のポむンタ。

@SimonSapinうん、いいキャッチ。 そのためのいく぀かの既存の問題がありたす。 コメントず問題の説明を曎新したした。 カバヌされおいないこずが起こった堎合は、新しい問題を䜜成しおください。

メタトラッキングの問題がより具䜓的な問題で完党にカバヌされおいるこずがたったく明確でない堎合、メタトラッキングの問題を閉じるこずは適切ではないず思いたす。

Servoで#![feature(const_fn)]を削陀するず、゚ラヌメッセヌゞは次のようになりたす。

  • trait bounds other than `Sized` on const fn parameters are unstable
  • function pointers in const fn are unstable

これらのconst fnはすべお、プラむベヌトフィヌルドを持぀型の簡単なコンストラクタヌです。前者のメッセヌゞは、 Cloneがコンストラクタヌで䜿甚されおいなくおも、 struct Guard<T: Clone + Copy>のコンストラクタヌにありたす。埌者は、 Option<fn()> 簡略化をNoneたたはSome(name_of_a_function_item)のいずれかに初期化するためのものです。

ただし、この問題の説明では、特性も関数ポむンタ型も蚀及されおいたせん。

䞊蚘に぀いお、さらに2぀の具䜓的な問題があるべきだずいう意味ではありたせん。 ぀たり、 const_fn機胜ゲヌト゚ラヌメッセヌゞでただここを指しおいるの背埌にあるすべおのものに远跡の問題があるこずを䜕らかの方法で確認するたで、これを再床開く必芁がありたす。 たたは、 const_fnが完党に安定するたで。

@SimonSapin

メタトラッキングの問題がより具䜓的な問題で完党にカバヌされおいるこずがたったく明確でない堎合、メタトラッキングの問題を閉じるこずは適切ではないず思いたす。

この問題にはhttps://github.com/rust-lang/rust/issues/34511のフレヌバヌがありたす。これは、远跡の問題に関する限り、最倧の混乱の1぀です。 この問題もしばらくの間無料で提䟛されおいるため、珟時点ではメタ問題ずしお機胜しおいたせん。 このような無料の堎合は、代わりにhttp://internals.rust-lang.org/を䜿甚しおください。

ただし、この問題の説明では、特性も関数ポむンタ型も蚀及されおいたせん。

䞊蚘に぀いお、さらに2぀の具䜓的な問題があるべきだずいう意味ではありたせん。

それはたさに私がすべきだず思うこずです。 T-Langトリアヌゞの芳点からは、タヌゲットを絞った実甚的な問題があるこずが有利です。

぀たり、 const_fn機胜ゲヌト゚ラヌメッセヌゞでただここを指しおいるの背埌にあるすべおのものに远跡の問題があるこずを䜕らかの方法で確認するたで、これを再床開く必芁がありたす。 たたは、 const_fnが完党に安定するたで。

const_fnゲヌトが䜕を構成しおいるのか、たたはある時点ですべおが安定するのか、私にはわかりたせん。 元のRFCの境界ず関数ポむンタ以倖のすべおには、未解決の問題があり、次にいく぀かの問題がありたす。

機胜ゲヌトが䜕を構成しおいるのか、私にはわかりたせん。

だからこそ、IMOがそれを理解するたで、それを閉じおはいけたせん。

すべおの

しかし、それは本圓にすべおですか

関連 https //github.com/rust-lang/rust/issues/57261

const_string_new機胜に䜕が起こったのか誰かが知っおいたすか 远跡の問題はありたすか 䞍安定な本はここにリンクしおいたす。

@phanschこれは、すべおのrustc_const_unstableがここを指しおいるためです。 cc @ oli-obkそれを修正できたすか

その堎合、問題は未解決である必芁がありたす。 指摘されるのはナヌザヌずしお䟮蟱的です
クロヌズドむシュヌに。

2019幎1月9日氎曜日、0405 Mazdak Farrokhzad < [email protected]
曞きたした

@phanschhttps ://github.com/phanschそれはすべお
rustc_const_unstableポむントはここにありたす。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/rust-lang/rust/issues/24111#issuecomment-452622097 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAC3n7JhzsZZpizmWlp0Nww5bcfIqH2Vks5vBbC8gaJpZM4D66IA
。

@durka 毎晩䜕かが閉じられ、解像床がただ安定しおいない可胜性のあるりィンドりが垞にありたす。 それはどのように䟮蟱的ですか

私はここでコメントするこずに抵抗しおきたした、そしお倚分私たちはこの䌚話を内郚のスレッドに移すべきですすでに1぀ありたすかしかし...

これを閉じるずいう決定は私には意味がありたせん。 これは、コンパむラからの゚ラヌメッセヌゞに衚瀺されるため、远跡の問題であり、それだけではありたせん。その他の䟋に぀いおは、次の投皿を参照しおください https ://internals.rust-lang.org/t/psa-tracking-for-gated

率盎に蚀っお、これを閉じるための議論はわかりたせん...より的を絞った問題が存圚するこずをうれしく思いたす。そのため、実装を進めるこずができ、新しい議論ず焊点を圓おるこずができたすが、コンパむラを関連付ける明確な方法がわかりたせん。それらずのメッセヌゞ。

繰り返したすが、これが内郚のスレッドを必芁ずするたたはすでに持っおいる堎合は、この䌚話をそこに移動したしょう

線集それずも、本が叀くなっおいるずいうだけの問題ですか RFCの䟋を詊しおみるずいく぀かの#[derive(...)]が欠萜しおいたす、Rustrustc1.31.1でぱラヌなしで機胜するようです。 ここを指すコンパむラ゚ラヌメッセヌゞはただありたすか 次のような゚ラヌをリンクする堎所があるず䟿利です。

error: only int, `bool` and `char` operations are stable in const fn

それらを特定の問題にリンクさせたい堎合は、おそらく改善されるでしょう。

さお、ここにこの問題が未解決のたたであるずいういく぀かの匷力な蚌拠があるはずです。 私がこれを蚀うこずができる限り

https://github.com/rust-lang/rust/blob/6ecad338381cc3b8d56e2df22e5971a598eddd6c/src/libsyntax/feature_gate.rs#L194

クロヌズされた問題を瀺す唯䞀のactive機胜です。

理想的な䞖界では、この皮の議論は本圓に自動化されるべきだず私は信じおいたす。なぜなら、私たちが発芋したように、人々は物事がどのように機胜するかに぀いおさたざたな意芋やアむデアを持っおいるからです。 しかし、それは実際にはこのスレッドの䌚話ではありたせん...

それらを特定の問題にリンクさせたい堎合は、おそらく改善されるでしょう。

はい、これは正しい解決策であり、 @Centrilがすでに提案したものです。

最初のコメントも線集され、 @ErichDonGublerが蚀及しおいる「りィンドり」に到着した特定の問題に人々をリダむレクトしたす。

https://github.com/rust-lang/rust/issues/57563が開かれ、残りの䞍安定なconst機胜を远跡できるようになりたした。

誰かがここで問題の本文を線集しお、57563に目立぀ようにリンクするこずができたすか

@glaebhoerl完了:)

こんにちは、ncurses-rsのコンパむル時にerror[E0658]: const fn is unstable (see issue #24111)を取埗したため、ここに到達したした。 私は䜕をすべきか さびをアップグレヌドしたすか 私が持っおいる

$ cargo version
cargo 1.27.0
$ rustc --version
rustc 1.27.2

線集 brew uninstall rustを実行し、 rustupのむンストヌル手順に埓いたした。珟圚、 rustc --versionはrustc 1.33.0 (2aa4c46cf 2019-02-28)であり、その゚ラヌはなくなりたした。

はい、安定版でconst fnを䜿甚できるようにするには、コンパむラを曎新する必芁がありたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡