2017-05-15 9 views
2

Rustでオーバーロード演算子でconstを使用できますか?このコードで

#![allow(dead_code)] 
use std::ops::Add; 
struct Foo(i32); 

const X: i32 = 1; 
const Y: i32 = X + X; 
const A: Foo = Foo(1); 
const B: Foo = A + A; 

impl Add for Foo { 
    type Output = Foo; 
    fn add(self, rhs: Foo) -> Foo { 
     Foo(self.0 + rhs.0) 
    } 
} 

コンパイラは言う:

error[E0015]: calls in constants are limited to struct and enum constructors 
--> src/main.rs:8:16 
    | 
8 | const B: Foo = A + A; 
    |    ^^^^^ 
    | 
note: a limited form of compile-time function evaluation is available on a nightly compiler via `const fn` 
--> src/main.rs:8:16 
    | 
8 | const B: Foo = A + A; 
    |    ^^^^^ 

が最高の代替は何ですか?

答えて

2

いいえ、できません。

:つまり、 addの実装では、あなたが「手で」あなたの定数を構築する必要がありますパニック、印刷出力、ファイルを読み込み、メモリを割り当てるなど

含む錆が行うことができます文字通りを行うことができます

const B: Foo = Foo(2); 

錆コードを生成するbuild scriptを利用して、プログラムに戻すこともできます。


エラーメッセージが言うように:

ノート:コンパイル時の機能評価の限定された形が、しかしconst fn

経由毎晩コンパイラで提供され、それはしませんが現在は形質法ができていないので、ここで助けてください。constAdd::add(または他のオペレーターの形質)はあまりにも限定的なconstと表示されているのでしょうか?上記のすべての機能を使用して、Addの実装を実装しています。 const関数で特殊化/サブタイプ化がどのように機能するかはわかりません。

+0

* const関数で特殊化/サブタイプ化がどのように機能するかわかりません。* =>これは大きな問題ですね。私はチームがそれをどのように処理しようとしているのか、定数式で算術などの共通の特性を使用する能力がないと考えていません...彼らはむしろ無意味になるでしょう。 –

関連する問題