這個問題在這里已經有了答案: 為什么 Rust 只允許陣列大小的獨立常量? (2 個答案) 昨天關門了。
我想撰寫一個函式,它接受兩個輸入引數,這兩個輸入引數具有const通用引數A和B它們的型別,并回傳一個將總和A B作為const通用引數的型別。這是我正在嘗試做的事情:
pub struct X<const A: usize>();
pub fn f<const A: usize, const B: usize>(_: X<A>, _: X<B>) -> X<A B> {
X()
}
不幸的是,編譯器向我大喊大叫,并顯示以下錯誤訊息:
error[E0404]: expected trait, found const parameter `A`
--> <source>:3:65
|
3 | pub fn f<const A: usize, const B: usize>(_: X<A>, _: X<B>) -> X<A B> {
| ^ not a trait
error[E0404]: expected trait, found const parameter `B`
--> <source>:3:69
|
3 | pub fn f<const A: usize, const B: usize>(_: X<A>, _: X<B>) -> X<A B> {
| ^ not a trait
error[E0747]: type provided when a constant was expected
--> <source>:3:65
|
3 | pub fn f<const A: usize, const B: usize>(_: X<A>, _: X<B>) -> X<A B> {
| ^^^^^
error: aborting due to 3 previous errors
我發現錯誤訊息很混亂。如果我在 周圍加上大括號A B,則錯誤訊息將更改為:
error: generic parameters may not be used in const operations
--> <source>:3:66
|
3 | pub fn f<const A: usize, const B: usize>(_: X<A>, _: X<B>) -> X<{A B}> {
| ^ cannot perform const operation using `A`
| = help: const parameters may only be used as standalone arguments, i.e. `A`
error: generic parameters may not be used in const operations
--> <source>:3:70
|
3 | pub fn f<const A: usize, const B: usize>(_: X<A>, _: X<B>) -> X<{A B}> {
| ^ cannot perform const operation using `B`
| = help: const parameters may only be used as standalone arguments, i.e. `B`
這似乎好一點,但我不明白為什么在這里禁止添加A和。B
所以我的兩個問題是:
- 為什么這里禁止加
AandB? - 有什么辦法可以解決此限制?
我檢查了https://doc.rust-lang.org/reference/items/generics.html#const-generics在那里我可以找到限制
const 引數只能作為型別或陣列重復運算式中的獨立引數出現。
但是沒有提示為什么會有這種限制或如何解決它。
uj5u.com熱心網友回復:
這是 rustc 的限制。Const 泛型,至少在穩定的情況下,還沒有通過開發的最小可行產品階段。目前,這意味著 const 泛型只能采用普通常量的值,無論它們來自泛型引數、文字還是常規 const 項。根據您的需要,有兩種不同的解決方法。
選項 1:使用generic_const_exprs功能:
#![feature(generic_const_exprs)]
pub struct X<const A: usize>();
pub fn f<const A: usize, const B: usize>(_: X<A>, _: X<B>) -> X<{A B}> {
X()
}
顯然,它只適用于夜間。此外,它是一個不完整的功能,雖然我認為沒有任何健全性問題,但至少在夜間版本 1.67 中存在一些粗糙的邊緣。
選項 2:使用第三個通用引數:
pub struct X<const A: usize>();
pub fn f<const A: usize, const B: usize, const C: usize>(_: X<A>, _: X<B>) -> X<C> {
assert_eq!(A B, C);
X()
}
這適用于穩定,這是我建議你做的。缺點是不變檢查發生在運行時,即使可以在編譯時評估檢查。它比夜間解決方案更符合人體工程學,但更有可能表現出來,并允許您檢查任意復雜的不變數,即使是那些只在運行時才完全知道的不變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/537059.html
標籤:仿制药锈编译时
上一篇:型別“T”上不存在屬性“建構式”
