質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

4368閲覧

[Rust]const genericについて、配列の大きさに[0;N/2]のような式を使うと怒られるがコンパイラに勧められた謎のトレイト境界で怒られなくなる。なぜ?

hidekiti

総合スコア23

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

4グッド

0クリップ

投稿2021/08/25 08:26

環境

  • cargo: cargo 1.56.0-nightly

ソースコード

怒られる

rust

1#![feature(const_generics)] 2#![feature(const_evaluatable_checked)] 3 4struct Sample<const N:usize>([i32;N]); 5impl<const N:usize> Sample<N> { 6 pub fn sample(&self){ 7 let _s= [0;N/2]; 8 } 9}

error

1unconstrained generic constant 2try adding a `where` bound using this expression: `where [(); N/2]:`

怒られない

rust

1#![feature(const_generics)] 2#![feature(const_evaluatable_checked)] 3 4struct Sample<const N:usize>([i32;N]); 5impl<const N:usize> Sample<N> where [(); N/2]:,{ 6 pub fn sample(&self){ 7 let _s= [0;N/2]; 8 } 9}

どうしてなんでしょう?私気になります!!

この謎の

mosh, magf, yskszk63, namnium1125👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

N/2であれば、任意のN: usizeでコンパイルエラーにならないことが(少なくとも人間には)わかりますが、例えば[0; N-1]の場合、N = 0とするとコンパイルできませんよね.
RustではC++(17以前としておきます)のtemplateとは異なり、ジェネリック境界を適切に定義する必要があります.
関数本体のブロックの中は境界にならないので、代わりにwhere [(); N/2]と書くことで、[(); N/2]、ひいては[i32; N/2]等が有効な型であることを境界条件としているのでしょう.

参考:Const well-formedness and const equality

投稿2021/08/25 09:10

編集2021/08/25 13:01
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hidekiti

2021/08/25 11:13

回答有り難うございます! よくわかりました。コンパイラは型とトレイトと型境界を見て判断するので、型境界でちゃんと正当な型か示して置く必要があるんですね! 逆に言えば、<const N:usize,const LES_THAN_N:usize>を実現したければ、where [();N-LES_THANN]:,としておけばいいんですね!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問