Rust: const fn ์ถ”์  ๋ฌธ์ œ(RFC 911)

์— ๋งŒ๋“  2015๋…„ 04์›” 06์ผ  ยท  274์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

https://github.com/rust-lang/rust/issues/57563 | ์ƒˆ๋กœ์šด ๋ฉ”ํƒ€ ์ถ”์  ๋ฌธ์ œ

์˜ค๋ž˜๋œ ์ฝ˜ํ…์ธ 

Rust-lang/rfc#911์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ.

์ด ๋ฌธ์ œ๋Š” ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ œ๋ฅผ ์œ„ํ•ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ์ •ํ™” ์ „์— ํ•ด์•ผ ํ•  ์ผ:

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 ๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์ด ์•„๋งˆ๋„ ๋ชจ๋ฒ” ์‚ฌ๋ก€์ผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ์ผ์ด ํ˜„์žฌ C++์—์„œ contexpr์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹จ์ง€ ๋ถˆํ•„์š”ํ•œ ์žฅํ™ฉํ•จ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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์ด ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์˜์‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ์„ ํ˜ธํ•˜๋Š” ์ตœ์ข… ๊ฒŒ์ž„์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค... ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ๊ตญ C++์˜ constexpr ๋””์ž์ธ ์ „์ฒด๋ฅผ ๊ฑฐ์˜ ๋ณต์‚ฌํ•˜๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์›ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡๋ณด๋‹ค๋„ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์–ธ์–ด์˜ ์–ด๋Š ๋ถ€๋ถ„์„ ๋‹ค๋ฃฐ ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ๋ช…ํ™•ํ•œ ๊ฒฌํ•ด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ด๊ฒƒ์€ ๋‚ด ์ƒ๊ฐ์— ์ •์ˆ˜์— ๋Œ€ํ•œ ๊ด€๋ จ ์ƒ์ˆ˜ ๋˜๋Š” ์ œ๋„ค๋ฆญ ์ง€์›๊ณผ ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

@eddyb ์™€ ์ €๋Š” ์ตœ๊ทผ์— ๋งค์šฐ ๊ด‘๋ฒ”์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ง€์†์ ์œผ๋กœ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ์Šค์ผ€์น˜๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ƒ์ˆ˜๋ฅผ MIR๋กœ ๋‚ฎ์ถ”๊ณ  ํ•ด์„(๊ฒฝ์šฐ์— ๋”ฐ๋ผ
์ถ”์ƒ ํ•ด์„, ์•„์ง ํ‰๊ฐ€ํ•  ์ˆ˜ ์—†๋Š” ์ œ๋„ค๋ฆญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ "๋‚ด์žฅ ์–ธ์–ด"์˜ ๋งค์šฐ ๋งŽ์€ ๋ถ€๋ถ„์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ ์‰ฌ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ ์‹ค์ œ ์ฝ”๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ํ•„์š”์„ฑ์— ๋ถ€๋”ช์นฉ๋‹ˆ๋‹ค. ์ฆ‰, Vec ๋˜๋Š” ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ ์ด ์ „์ฒด ํ•ด์„ ๊ณ„ํš์ด ๋‚ด ๋งˆ์Œ์— ๋” ๋ณต์žกํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, @glaebhoerl , ๊ท€ํ•˜๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๋Œ€์•ˆ์  ์ตœ์ข… ๊ฒŒ์ž„์— ๋Œ€ํ•ด ๋ถ„๋ช…ํžˆ ๋ง์”€ํ•ด ์ฃผ์…จ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด const fn RFC์—์„œ ๊ทธ๋Ÿฐ ์ƒ๊ฐ์„ ์Šค์ผ€์น˜ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‹ค์‹œ, ๊ทธ๋ฆฌ๊ณ  ์ด ๋งฅ๋ฝ์—์„œ ๋“ฃ๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :)

ํ• ๋‹น์˜ ๋ฌธ์ œ๋Š” ๋Ÿฐํƒ€์ž„์œผ๋กœ ํƒˆ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ปดํŒŒ์ผ ํƒ€์ž„/๋Ÿฐํƒ€์ž„ ์žฅ๋ฒฝ์„ ๋„˜๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ๋“  ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด const fn ๋กœ liballoc ๊ฐ€ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
ํ•ด์„๋œ ์Šคํƒ์—์„œ ๋ฐ”์ดํŠธ ์ฃผ์†Œ ์ง€์ •์ด ๊ฐ€๋Šฅํ•œ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ํ• ๋‹น์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋” ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ํ•ด๋‹น ์žฅ๋ฒฝ์„ ํ†ต๊ณผํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ  ์ฑ„์šฐ๋Š” ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์™„์ „ํ•œ constexpr ์™€ ๊ฐ™์€ ํ‰๊ฐ€๊ฐ€ ์žˆ๋”๋ผ๋„ const fn ๋Š” _์—ฌ์ „ํžˆ_ ์ˆœ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. 'static ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜๋ฉด ๋˜‘๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ณ  ๋ถ€์ž‘์šฉ.

@nikomatsakis ๋‚ด๊ฐ€ ํ•˜๋‚˜ ์žˆ์—ˆ๋‹ค๋ฉด ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์–ธ๊ธ‰ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :) ๋‚˜๋Š” ์ฃผ๋กœ ์•Œ๋ ค์ง„ ๋ฏธ์ง€์˜ ๊ฒƒ์„ ๋ด…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€๋กœ const ๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ ๋ฌผ๋ก  ๋‚ด๊ฐ€ C++ ๋””์ž์ธ์œผ๋กœ ์ดํ•ดํ•œ ๊ฒƒ์˜ ์ผ๋ถ€์˜€์Šต๋‹ˆ๋‹ค. const s ๋ฐ const ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํ•œ, ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ const ๊ฐ€ ํ•ด๋‹น ์œ ํ˜•์˜ ์ผ๋ถ€๋กœ ํฌํ•จ๋œ ๊ณ ์ • ํฌ๊ธฐ ๋ฐฐ์—ด์ด ์žˆ๊ณ  ์ถ”์ƒํ™”ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ด ์•„๋‹Œ ํ›จ์”ฌ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ๋†€๋ž„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. const fn ๋ถ€๋ถ„์ด ๋” ๋ถ„๋ฆฌ๋˜๊ณ  ๊ฐ€๋ณ€์ ์ž…๋‹ˆ๋‹ค. ๋” ๋‚˜์•„๊ฐ€ ์ œ๋„ค๋ฆญ์—์„œ const impl s ๋ฐ const Trait ๊ฒฝ๊ณ„์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ–๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ, ์ €๋Š” _ํ™•์‹ _ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์— ๋Œ€ํ•œ ์„ ํ–‰ ๊ธฐ์ˆ ์ด ์žˆ์œผ๋ฉฐ ์ด๋ฏธ ์ƒํ™ฉ์„ ํŒŒ์•…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ฐพ์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Rust ์–ธ์–ด์˜ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘์—์„œ ์ปค๋„๊ณผ ๊ฐ™์ด ์ฃผ๋กœ ์ €์ˆ˜์ค€ ์ œ์–ด๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ๋“ค์€ ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ์ž˜ ์„œ๋น„์Šค๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ Rust๊ฐ€ ๋งŽ์€ ์ž ์žฌ๋ ฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์˜์—ญ์€ ์ฃผ๋กœ ๊ณ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค. ๋‹จ๊ณ„์  ๊ณ„์‚ฐ( const fn ์ด ์ด๋ฏธ ๋งค์šฐ ์ œํ•œ๋œ ์‚ฌ๋ก€์ž„)์„ ์œ„ํ•œ ๊ณต๊ฐ„์˜ ๊ฐ•๋ ฅํ•œ ์ง€์›(์–ด๋–ค ํ˜•ํƒœ๋กœ๋“ )์€ ๊ฒŒ์ž„ ์ฒด์ธ์ €๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. (์ง€๋‚œ ๋ช‡ ์ฃผ ๋™์•ˆ Rust์—์„œ ๋” ๋‚˜์€ ์Šคํ…Œ์ด์ง• ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์–ธ์–ด๋กœ ์ „ํ™˜ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์‚ฌ๋žŒ๋“ค์˜ ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ํŠธ์œ— ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.) ๊ธฐ์กด ์†”๋ฃจ์…˜์ด "์šฐ๋ฆฌ์™€ ๊ฐ€๊นŒ์šด" ์–ธ์–ด๋กœ ๋œ ๊ฒƒ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C++์˜ constexpr , D์˜ ad-hoc CTFE, ์šฐ๋ฆฌ์˜ ์ ˆ์ฐจ์  ๋งคํฌ๋กœ -- ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ผ์— ์ถฉ๋ถ„ํžˆ ์˜๊ฐ์„ ์ฃผ๊ณ  ๊ฐ•๋ ฅํ•˜๊ณ /์™„๋ฒฝํ•˜๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. (์ ˆ์ฐจ์  ๋งคํฌ๋กœ๋Š” ์žˆ์œผ๋ฉด ์ข‹์€ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์„ฑ๋Šฅ ์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ ์ƒ์„ฑ๋ณด๋‹ค๋Š” ์ถ”์ƒํ™”์™€ DSL์— ๋” ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.)

์˜๊ฐ์„ ์ฃผ๊ณ  ์ถฉ๋ถ„ํžˆ ์ข‹์€ ๊ฒƒ์— ๊ด€ํ•ด์„œ๋Š”... ์ €๋Š” ์•„์ง ๊ทธ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ๊ณ , ์ •ํ™•ํžˆ ์–ด๋””๋ฅผ ๋ด์•ผ ํ• ์ง€๋ฅผ ์•Œ ๋งŒํผ ์ „์ฒด ๊ณต๊ฐ„์— ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์œ„์˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ ์šฐ๋ฆฌ๋Š” Julia์™€ Terra๊ฐ€ ์—ฌ๋Ÿฌ ๋ฉด์—์„œ Rust์™€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์–ธ์–ด์ฒ˜๋Ÿผ ๋ณด์ผ์ง€๋ผ๋„ ์ตœ์†Œํ•œ ํ•œ ๋ˆˆ์— ๋ณด๊ธฐ๋ฅผ ์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Oleg Kiselyov๊ฐ€ ์ด ๋ถ„์•ผ์—์„œ ๋งŽ์€ ํฅ๋ฏธ๋กœ์šด ์ผ ์„ ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค์นผ๋ผ๋ฅผ ์œ„ํ•œ Lancet ๋ฐ Lightweight Modular Staging ์— ๋Œ€ํ•œ Tiark Rompf์˜ ์ž‘์—…์€ ํ™•์‹คํžˆ ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. @kmcallister ๊ฐ€ ์ข…์†์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋œ Rust๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๋Œ€ํ•œ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ ๋ณธ ๊ธฐ์–ต์ด ์žˆ์Šต๋‹ˆ๋‹ค const ๊ทธ ์œ ํ˜• ์ž์ฒด๋Š” ์ผ์ข…์˜ ์Šคํ…Œ์ด์ง•์ž…๋‹ˆ๋‹ค(์ปดํŒŒ์ผ๊ณผ ๋Ÿฐํƒ€์ž„ ์‚ฌ์ด์˜ ์œ„์ƒ ๋ถ„๋ฆฌ๊ฐ€ ์Šคํ…Œ์ด์ง€์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค)... ์—ฌ๋Ÿฌ ๋ฐฉํ–ฅ์—์„œ ํฅ๋ฏธ๋กœ์šด ์ž ์žฌ์  ์—ฐ๊ฒฐ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋†“์นœ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ์†”๋ฃจ์…˜์— ์ „๋…ํ•œ๋‹ค๋ฉด ๊ธฐํšŒ์ž…๋‹ˆ๋‹ค. :)

(์ด๊ฒƒ์€ ๋‹จ์ง€ ๋ธŒ๋ ˆ์ธ ๋คํ”„์˜€์œผ๋ฉฐ ๋‚˜๋Š” ๋งŽ์€ ๊ฒƒ์„ ๊ฑฐ์˜ ์™„๋ฒฝํ•˜๊ฒŒ ํŠน์„ฑํ™”ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ "๋‚ด์žฅ ์–ธ์–ด"์˜ ๋งค์šฐ ๋งŽ์€ ๋ถ€๋ถ„์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ ์‰ฌ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ ์‹ค์ œ ์ฝ”๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ํ•„์š”์„ฑ์— ๋ถ€๋”ช์นฉ๋‹ˆ๋‹ค. ์ฆ‰, Vec ๋˜๋Š” ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ ์ด ์ „์ฒด ํ•ด์„ ๊ณ„ํš์ด ๋‚ด ๋งˆ์Œ์— ๋” ๋ณต์žกํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” "์‹ค์ œ ์ฝ”๋“œ"์˜ ํŠน์„ฑํ™”์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํž™ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์˜ ํ•„์š”์„ฑ์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— Rust์— ํฐ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋‚ด ์ฝ”๋“œ๋Š” ๊ฐ€๋Šฅํ•  ๋•Œ๋งˆ๋‹ค ํž™ ํ• ๋‹น์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์ฒด์ ์ธ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ณด๋‹ค ๋” ๋งŽ์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด _์ข‹์ง€๋งŒ_ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฐ•์ œ ๋ถˆ๋ณ€์œผ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์œ ํ˜•์˜ ์ •์  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. C++ constexpr ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋งค์šฐ ์ œํ•œ์ ์ด์ง€๋งŒ ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ํ•„์š”ํ•œ ๊ฒƒ ์ด์ƒ์ž…๋‹ˆ๋‹ค. ๋งค๊ฐœ ๋ณ€์ˆ˜ x ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ T ์œ ํ˜•์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. x , y , z x , y , z ๊ฐ€ ์œ ํšจํ•จ์„ ๋ณด์žฅํ•˜๋Š” 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/๋„ ์žˆ์œผ๋ฉฐ, ์‹ฌ์ง€์–ด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Rust์™€ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ ;) ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹จ๊ณ„์  ๊ณ„์‚ฐ์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํŠน์ • ๋ถ€๋ถ„ ํ‰๊ฐ€.

2016๋…„ 1์›” 16์ผ ํ† ์š”์ผ ์˜คํ›„ 6์‹œ 29๋ถ„, Eduard-Mihai Burtescu <
[email protected]>์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@glaebhoerl https://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 ๊ณผ ๋‹ฌ๋ฆฌ)์€ _์ •๋ง_ ํ•ด์ œํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” const ์ž๊ฒฉ์ด ์—†๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ fn ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์—ฌ์ „ํžˆ ์ž„์˜์˜ ๊ตฌํ˜„ ๋…ธ์ถœ ์ œํ•œ์„ ์ค‘์‹ฌ์œผ๋กœ ํšŒ์ „ํ•˜๋Š” const ์ด ์žˆ์œผ๋ฉฐ ๊ฑฐ์˜ โ€‹โ€‹๋ชจ๋“  ๊ณณ์—์„œ const ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋„ ๊ทธ๋‹ค์ง€ ๋งค๋ ฅ์ ์œผ๋กœ ๋“ค๋ฆฌ์ง€ ์•Š๋Š”๊ตฐ์š”...

์ฆ‰, ์›์‹œ ํฌ์ธํ„ฐ์˜ ์‚ฌ์šฉ์€ ๋Ÿฐํƒ€์ž„๊ณผ ๊ฐ™์€ ์ง์ ‘์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋กœ ๋ฐ”๋€Œ์ง€ ์•Š๊ณ  ํ• ๋‹น๋œ ์ฃผ์†Œ์˜ ํ•ด์‹œ๋งต ์กฐํšŒ์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@glaebhoerl ๊ธ€์Ž„, ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์„ค๋ช…ํ•œ ๋ชจ๋ธ ๊ณผ @tsion ์˜ miri ๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

์ผ๊ด€์„ฑ์„ ์œ„ํ•ด _ํ•„์š”ํ•œ_ ์ˆœ์ˆ˜์„ฑ ๋•Œ๋ฌธ์— FFI ๊ตฌ๋ถ„์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
Rust const fn ์—๋Š” unsafePerformIO ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 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 (๋Œ“๊ธ€ 31์ด ์•„๋‹Œ 11)์— ์—ฐ๊ฒฐํ•˜๋ ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@tsion ๊ณ ์ •, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‚ด๊ฐ€ ์™„์ „ํžˆ ๋ฒ—์–ด๋‚ฌ๋‹ค๋ฉด ์ด๊ฒƒ์„ ๋ฌด์‹œํ•˜์‹ญ์‹œ์˜ค.

์ด RFC์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž๋กœ์„œ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ํ•จ์ˆ˜ const fn ๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์ด ์•„๋งˆ๋„ ๋ชจ๋ฒ” ์‚ฌ๋ก€์ผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ์ผ์ด ํ˜„์žฌ C++์—์„œ contexpr์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹จ์ง€ ๋ถˆํ•„์š”ํ•œ ์žฅํ™ฉํ•จ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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์— ๋Œ€ํ•œ ๋งŽ์€ ํ† ๋ก ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์ฐจ๋‹จ๊ธฐ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ตœ๊ทผ ๋Œ“๊ธ€์ด ์—†์œผ๋ฉฐ ์ž‘์—…์ด ๊ทธ๋‹ค์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๊ฐ€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์„ ๊ฒฐ์Šน์„ ์„ ๊ฐ€๋กœ์งˆ๋Ÿฌ ์–ด๋–ป๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋กœ์ผ“์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค: https://github.com/SergioBenitez/Rocket/issues/19#issuecomment -269052006

https://github.com/rust-lang/rust/issues/29646#issuecomment -271759986์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๋˜ํ•œ miri๊ฐ€ "์ „์—ญ์  ๋ถ€์ž‘์šฉ"์— ๋Œ€ํ•œ ํ•œ๊ณ„๋ฅผ ๋„˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹œ์„ฑ์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ์ž…์žฅ์„ ์žฌ๊ณ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( @solson ๋ฐ @nikomatsakis ๋Š” IRC์—์„œ ์ด์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค).

์ด RFC์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž๋กœ์„œ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ๊ธฐ๋Šฅ const fn์„ ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ์•„๋งˆ๋„ ๋ชจ๋ฒ” ์‚ฌ๋ก€์ผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ž„์˜์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ C ์ฝ”๋“œ ๋˜๋Š” ์ •์ ์— ์•ก์„ธ์Šคํ•˜๋ฉด ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์œผ๋กœ const fn์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ณต์šฉ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜๋Š” ๋ฆฐํŠธ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฆฐํŠธ์— ๋Œ€ํ•ด ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๋‚ด์žฅ ๋ฆฐํŠธ missing_docs , missing_debug_implementations ๋ฐ missing_copy_implementations ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณดํ‘ธ๋ผ๊ธฐ๋ฅผ ์ผœ๋Š” ๋ฐ๋Š” ์ผ์ข…์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ... const ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ์›ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚˜์ค‘์— ํ•จ์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•  ๊ณ„ํš์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. const ์ผ ์ˆ˜ ์—†๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ const ๋กœ ์ปค๋ฐ‹ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค( const ์ œ๊ฑฐ๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค).

#[allow(missing_const)] fn foo() {} ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ํšจ๊ณผ๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

@eddyb @nikomatsakis " const ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค." ์š”์ ์€ fn์ด fn ์ด _remain_ const ํ•œ๋‹ค๋Š” ๋‹ค์šด์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์•ฝ์†์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ–๊ณ  ์‹ถ์–ดํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค.

std ๋ฐ ๊ธฐํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ const ๊ฐ€ ๋ฟŒ๋ ค์ ธ์•ผ ํ•˜๋Š”์ง€๋Š” ์ˆ˜์น˜์Šค๋Ÿฌ์šด ์ผ์ด์ง€๋งŒ ๊ณต๊ฐœ์ ์œผ๋กœ๋งŒ ์š”๊ตฌ๋˜์ง€ ์•Š๋Š” ํ•œ ์–ด๋–ป๊ฒŒ ํ”ผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง๋ฉดํ•˜๋Š” ํ•ญ๋ชฉ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๊ทœ์น™์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ณต๊ฐœ ํ•ญ๋ชฉ์—๋งŒ ํ•„์š”ํ•˜๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๊ทœ์น™์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š๋Š” ํ•œ.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค... ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. const fn ์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ const๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฐœ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณดํ˜ธ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์ ์œผ๋กœ notconst ํ•จ์ˆ˜์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋ณด๋‹ค const fn ๊ฐ€ ๋” ๋งŽ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

notconst ๋Š” ๋˜ํ•œ Rust์˜ ๋””์ž์ธ ์ฒ ํ•™๊ณผ ๋” ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: " mut , const " ์•„๋‹˜)

๊ณต๊ฐœ ํ•ญ๋ชฉ์—๋งŒ ํ•„์š”ํ•˜๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๊ทœ์น™์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š๋Š” ํ•œ.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค... ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋‚˜๋Š”์ด ์•„์ด๋””์–ด์— ํ”Œ๋ฆฝ ํ”Œ๋กญ์ž…๋‹ˆ๋‹ค. ์žฅ์ ์ด ์žˆ์ง€๋งŒ(๊ณต๊ฐœ ์ธํ„ฐํŽ˜์ด์Šค ๊ฒฐ์ •์„ ๋‚ด๋ฆด ๋•Œ const fn ๊ณ ๋ ค ) ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

const fn ์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ const๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฐœ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณดํ˜ธ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‚ฌ์‹ค์ด๋ฉฐ ๋ถˆํ–‰ํžˆ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๊ฐ€ ๊ณต๊ฐœ ํ•จ์ˆ˜ const ๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ์•”์‹œ์ ์œผ๋กœ ํ•ด๋‹น ํ•จ์ˆ˜ const ์— ์˜ํ•ด ์ „์ด์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋„ ํ‘œ์‹œํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์˜๋„ํ•˜์ง€ ์•Š๊ฒŒ ํ‘œ์‹œํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ–ฅํ›„ ๋น„ const ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋‚ด๋ถ€ ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.


๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋ณด๋‹ค const fn ๊ฐ€ ๋” ๋งŽ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ž ์‹œ ๋™์•ˆ ์ด๋Ÿฐ ์ƒ๊ฐ์„ ํ–ˆ์ง€๋งŒ ์ˆœ์ˆ˜ํ•œ Rust ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌ๋ ˆ์ดํŠธ์—๋งŒ ํ•ด๋‹น๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. FFI ๊ธฐ๋ฐ˜ fns๋ฅผ const๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๊ทธ๊ฒƒ๋“ค์ด ๋‹จ์ง€ ์ „์ด์ ์œผ๋กœ FFI ๊ธฐ๋ฐ˜์ด๋”๋ผ๋„, ์ด๋Š” ๋งŽ์€ ์ผ์ž…๋‹ˆ๋‹ค), ๋”ฐ๋ผ์„œ const fn ์˜ ์ˆœ์ „ํ•œ ๊ธˆ์•ก์€ ๊ทธ๋ฆฌ ๋‚˜์˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ๊ณผ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๋Œ€๋กœ.


๋‚ด ํ˜„์žฌ ๊ฒฐ๋ก : ๋ช…์‹œ์ ์ด์ง€ ์•Š์€ const fn ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ‚ค์›Œ๋“œ๋ฅผ ๋งŽ์ด ์“ฐ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ๋ก์„ ์œ„ํ•ด notconst ๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

@solson ์•„์ฃผ ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค.

ํ‚ค์›Œ๋“œ๋ฅผ ํŠน์„ฑ ๋ฐฉ๋ฒ•๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํ‚ค์›Œ๋“œ๊ฐ€ ๋” ๋งŽ์•„์ง„๋‹ค๋Š” ์ ์„ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค. ํŠน์„ฑ ์ •์˜๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ์œ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ impls์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ถˆ์™„์ „ํ•œ "const fn parametrim" ๊ทœ์น™์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ด ์ ˆ์ถฉ์•ˆ์€ ์ฒ˜์Œ์— const fn ๋ฅผ ์ฑ„ํƒํ–ˆ์„ ๋•Œ ๊ฝค ์ฒ ์ €ํ•˜๊ฒŒ ๋…ผ์˜๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. @solson ๋‹˜ ์˜ ๋ถ„์„๋„ ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋œ ์œ ์ผํ•œ ๊ฒƒ์€ ์•„๋งˆ๋„ constable fns์˜ ๋น„์œจ์ด ๋” ์ปค์กŒ๋‹ค๋Š” ๊ฒƒ๋ฟ์ด์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๊ทผ๋ณธ์ ์ธ ์ ˆ์ถฉ์•ˆ์„ ๋ณ€๊ฒฝํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. const fn ๋ฅผ ๊ณต์šฉ ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ์— ์ ์ฐจ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์„ฑ๊ฐ€์‹  ์ผ์ด์ง€๋งŒ ์ด๊ฒƒ์ด ์ธ์ƒ์ž…๋‹ˆ๋‹ค.

@nikomatsakis ๋‚˜๋ฅผ ๊ดด๋กญํžˆ๋Š” ๊ฒƒ์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์‚ฌ์‹ค์˜ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ๊ฒƒ์„ ๋ฏธ๋ฆฌ ํ™•์ธํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. unsafe ์ฝ”๋“œ๋Š” "๋™์ ์œผ๋กœ ๋น„ const"์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ œ๋„ค๋ฆญ๊ณผ ํŠน์„ฑ ์ž„ํ”Œ์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ํ•˜๋“  "์˜ฌ๋ฐ”๋ฅธ" ๊ฒƒ๊ณผ ์œ ์—ฐํ•œ ๊ฒƒ ์‚ฌ์ด์˜ ์ ˆ์ถฉ์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"๊ธ€๋กœ๋ฒŒ ๋ถ€์ž‘์šฉ"์ด ์ฝ”๋“œ๊ฐ€ const fn ๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ์ฃผ์š” ์›์ธ์ด๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๊ฒƒ์ด Rust๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์ œ๊ฑฐ๋œ "ํšจ๊ณผ ์‹œ์Šคํ…œ"์ด ์•„๋‹™๋‹ˆ๊นŒ?
"ํšจ๊ณผ ์•ˆ์ •์„ฑ"์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ IMO๋ฅผ ํŒจ๋‹‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ์ฝ”๋“œ์™€ ์œ ์‚ฌํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

@eddyb ์ ˆ๋Œ€์ ์œผ๋กœ const ๋Š” ํšจ๊ณผ ์‹œ์Šคํ…œ์ด๊ณ  ์˜ˆ, ๊ฐ€๋Šฅํ•œ ํ•œ ํ”ผํ•˜๊ณ  ์‹ถ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ชจ๋“  ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค... ์ถ”๊ฐ€ํ•˜๋Š” ๊ณ ํ†ต์„ ๊ฒฌ๋””๋ ค๋ฉด ๊ทธ๋Ÿด๋“ฏํ•ฉ๋‹ˆ๋‹ค. ํšจ๊ณผ ์‹œ์Šคํ…œ์—์„œ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ํšจ๊ณผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ถ€ ๊ตฌ๋ฌธ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์šฐ๋ฆฌ๋Š” unsafe ์™€ ๋น„์Šทํ•œ ๊ฐ€๊ฒฉ์„ ์ง€๋ถˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(ํšจ๊ณผ๋„ ์žˆ์Œ). ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ๋“ค์„ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์ด์น˜์— ๋งž๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์œ„๋ฐ˜์ด ๋™์ ์œผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์ด ์˜ตํŠธ์ธ์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ํ›จ์”ฌ ๋” ๋งŽ์€ ์ด์œ ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์–ด๋–ค๊ฐ€์š”:

์ผ๋ฐ˜์ ์œผ๋กœ const fn s๋Š” ์ƒ์„ฑ์ž( new ) ๋˜๋Š” ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋•Œ๋•Œ๋กœ ์ƒ์ˆ˜๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. constness๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ • ํ•˜์ง€๋งŒ ์ •์˜ํ•˜๋Š” ๋ชจ๋“ˆ์— ๋Œ€ํ•ด์„œ๋งŒ ์ด ๋ฌธ์ œ๋ฅผ ๋งŽ์€ ๊ฒฝ์šฐ์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด const ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š” ํ•œ ์ข…์† ํ•ญ๋ชฉ์€ constness๋ฅผ ๊ฐ€์ •ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ชจ๋“  ๊ฒƒ์„ const ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ํ•จ์ˆ˜๋กœ ์ƒ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ๋ฆฌํ•จ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

@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 ๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•œ ๋””์ž์ธ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ณ  ์ด๋“ค๊ณผ ํŠน์„ฑ ์‚ฌ์ด์˜ ์ƒํ˜ธ ์ž‘์šฉ ๋ฐ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์œ ์—ฐ์„ฑ์ด ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” const fn์˜ ์‚ฌ์šฉ์„ ์•ˆ์ •ํ™”ํ•˜๋ ค๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ธ์ฒด ๊ณตํ•™์ ์ด๊ณ  ํ‘œํ˜„๋ ฅ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ "์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ"ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ƒ์ˆ˜ ํ‰๊ฐ€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์—ฌ์ „ํžˆ ์ƒ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

const fn์˜ ์‚ฌ์šฉ์„ ์•ˆ์ •ํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ const ๋กœ ์•ˆ์ •ํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒ€์€ ์ตœ์†Œํ•œ ๊ฐ์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@petrochenkov๋‹น ๊ฐ์‚ฌํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœ์„ ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์œ„ํ•ด PR https://github.com/rust-lang/rust/issues/43017 ์„ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŠน์ • ํŠน์„ฑ/impl ์ƒํ™ฉ์—์„œ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ/์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Zero ํŠน์„ฑ์„ ๊ฐ€์ง„ ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

์ด ํŠน์„ฑ์€ $#$ Vec $#$ ์— ์˜ํ•ด ๋’ท๋ฐ›์นจ๋˜๋Š” ์ผ๋ถ€ BigInt ์œ ํ˜•์— ์˜ํ•ด ์•”์‹œ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— zero ๋ฉ”์†Œ๋“œ๊ฐ€ const ์ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๊ณ„ ์Šค์นผ๋ผ ๋ฐ ๊ธฐํƒ€ ๋‹จ์ˆœ ์œ ํ˜•์˜ ๊ฒฝ์šฐ ๋ฉ”์†Œ๋“œ ๊ฐ€ 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 ์— ๋Œ€ํ•ด ์•ž์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํŠน์„ฑ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๋ชจ๋“  impls๊ฐ€ const fn ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์œผ๋กœ " const impl s"๋ฅผ ๊ฐ–๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋œ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. .

@jethrogb constness ๊ฐ€ impl์˜ ์†์„ฑ์ด ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ์—ผ๋‘์— ๋‘๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด T: Zero ๋ฐ”์šด๋“œ๊ฐ€ ์žˆ๋Š” ์ผ๋ฐ˜ const fn ์—๋Š” $#$7$#์— ๋Œ€ํ•œ impl ์˜ Zero ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค 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()
    }
}

์ƒ์šฉ๊ตฌ๋Š” ๋งคํฌ๋กœ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฑฐ์˜ ๋˜‘๊ฐ™์€ ์ผ์„ ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ํŠน์„ฑ( Zero ๋ฐ ConstZero )์ด ์žˆ๋‹ค๋Š” ์‚ฌ์†Œํ•œ ๋ถˆํŽธ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ํฌ๊ด„์ ์ธ ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•  ๋•Œ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๊ฐ€ ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// 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(์ „๋ฌธํ™”) ์˜ ๋ ๋ถ€๋ถ„์— ์ œ์•ˆ๋œ "๊ฒฉ์ž" ๊ทœ์น™์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์“ฐ๋Š” ๊ฒฝ์šฐ

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 bound) ํŠธ๋ ˆ์ž‡ ์‹œ์Šคํ…œ์ด ์ œ๊ณตํ•˜๊ณ  ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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 ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ๋  ๋•Œ ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ๋“  ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@Kixunil ์›ํ•˜๋Š” https://github.com/rust-lang/rfcs/issues/1631

@jethrogb ๋งํฌ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

mem::size_of ๊ฐ€ ์•ผ๊ฐ„์— const fn ๋กœ ๊ตฌํ˜„๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. mem::transmute ๋ฐ ๊ธฐํƒ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? Rust ๋‚ด์žฅ ํ•จ์ˆ˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋‚ด๋ถ€์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ์ด๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ ์ ˆํ•œ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ธฐ๊บผ์ด ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๊ฐ’์— ๋Œ€ํ•œ ์ž‘์—…์€ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ์ผ๋ถ€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์•ฝ๊ฐ„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. transmute ์—๋Š” ๋ฏธ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 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 ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€๋งŒ const fn s๋กœ ๋งŒ๋“ค์–ด์กŒ์„ ๋•Œ insta-const-stable์ด ๋˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ @nikomatsakis ์˜ ์šฐ๋ ค ํ‘œํ˜„์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. . ํŠน์ • ์šฐ๋ ค ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์ผ๋ฐ˜์ ์ธ ์ฃผ์˜ ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ IIRC๊ฐ€ ๊ธฐ๋Šฅ๋ณ„ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๊ฐ€ ์ถ”๊ฐ€๋œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€์— ๋Œ€ํ•œ ์šฐ๋ ค๋Š” FCP๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ๋น„์Šทํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @rustbot ์ด ๋™์ผํ•œ GitHub ์Šค๋ ˆ๋“œ์—์„œ ๋ณ„๋„์˜ FCP๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๋ชจ๋ฅด๊ฒ ์œผ๋ฏ€๋กœ ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@durka ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์˜ ์ผ๊ด€์„ฑ์„ ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ์ผ ์ถ”์  ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? FCP๊ฐ€ ์˜ฌ๋ผ์˜ค๋ฉด ์ œ์•ˆํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

alloc::Layout์˜ const fns์— ๋Œ€ํ•œ ํ† ๋ก  ์—์„œ ๋ฆฌ๋“œ๋ฅผ ๋”ฐ๋ฅด๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.
const fn ์—์„œ ํŒจ๋‹‰์„ ํ—ˆ์šฉํ•˜๊ณ  ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ์ƒ์ˆ˜ ์‚ฐ์ˆ  ํ‘œํ˜„์‹์œผ๋กœ ์ง€๊ธˆ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์˜ˆ, ๋ฏธ๋ฆฌ๊ฐ€ ๋ณ‘ํ•ฉ๋˜๋ฉด ์•„์ฃผ ์‚ฌ์†Œํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

const ๊ฐ€ ๋˜๋Š” ์ถ”๊ฐ€ std ๊ธฐ๋Šฅ์„ ์š”์ฒญํ•˜๊ธฐ์— ์ ํ•ฉํ•œ ๊ณณ์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด Duration:: { new , from_secs , from_millis } ๋Š” ๋ชจ๋‘ const ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์•ˆ์ „ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@remexre ๊ทธ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์•„๋งˆ๋„ PR์„ ๋งŒ๋“ค๊ณ  ๊ฑฐ๊ธฐ์—์„œ libs ํŒ€ ๊ฒ€ํ† ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/pull/47300์œผ๋กœ ํ™๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ถˆ์•ˆ์ •ํ•œ ์ƒ์„ฑ์ž์— const ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ std ํ•จ์ˆ˜๋ฅผ const ์„ ์–ธํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํŠนํžˆ mem::uninitialized ๋ฐ mem::zeroed ? ์ด ๋‘ ๊ฐ€์ง€๊ฐ€ ์ถ”๊ฐ€ const ๊ธฐ๋Šฅ์— ์ ํ•ฉํ•œ ํ›„๋ณด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋‹จ์ ์€ Drop ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์กฐ์ฒด ์ƒ์„ฑ์ด ptr::write ์—†์ด ์ƒ์„ฑ๋˜๊ณ  ๋ฎ์–ด์“ฐ์—ฌ์ง€๋Š” mem::uninitialized ์˜ ๋™์ผํ•œ ๋‹จ์ ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ ์ ˆํ•˜๊ฒŒ ๋“ค๋ฆฌ๋ฉด 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 ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. mem::uninitialized ๊ฐ€ const fn ์ธ ๊ฒฝ์šฐ $ Instant::now() ๋ฅผ mem::uninitialized::<Instant>()) ๋กœ ๋ฐ”๊พธ๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰์„ ์‹œ์ž‘ํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด ๊ตฌ์กฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ฝ”๋“œ๋Š” ๊ด€์šฉ์ ์ด์ง€ ์•Š์€ ๋…น์œผ๋กœ ๊ฐ„์ฃผ๋˜์ง€๋งŒ(์ „์—ญ ์ƒํƒœ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋งค์šฐ ๋‚˜์จ) ์ „์—ญ ์ •์  ๊ตฌ์กฐ๊ฐ€ ์œ ์šฉํ•œ ๋งŽ์€ ๊ฒฝ์šฐ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

์ด ๊ฒŒ์‹œ๋ฌผ์ด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์‹คํ–‰๋˜๋Š” 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 ์™€ ๊ฐ™์ง€ ์•Š์œผ๋ฉฐ ์ผ๋ถ€ ๋งค๋ ฅ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ฌด ์กฐ์น˜๋„ ์ทจํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. .

๋จผ์ € ์•ˆ์ •๋  ์ˆ˜ ์žˆ๋Š” ๋” ๋‚ฎ์€ ๋งค๋‹ฌ๋ฆฐ ๊ณผ์ผ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ณ  0์ด ๋˜๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜๋Š” ์–ด์จŒ๋“  ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์–ธ์  ๊ฐ€๋Š” ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ดˆ๊ธฐ์— ๊ทธ๊ฒƒ๋“ค์„ ์•ˆ์ •ํ™”ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ค‘๊ฐ„ ๊ณ„์‚ฐ์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค ํ•˜๋”๋ผ๋„ ๋ชจ๋“  ์ƒ์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์š”๊ตฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๊ณต์šฉ์ฒด ๋ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด์จŒ๋“  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ฑฐ๋‚˜ 0์ด ๋œ ๊ฒƒ์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋น„ const๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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 ๊ฒ€์‚ฌ๊ฐ€ const fn ๋‚ด๋ถ€์—์„œ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์‹ค์ˆ˜๋กœ ํ—ˆ์šฉ/์•ˆ์ •ํ™”ํ•˜์ง€ ์•Š์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์—„๊ฒฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Rust-lang/rfcs#2272๋ฅผ ํ†ตํ•ด ํŒจํ„ด๊ณผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํŒจํ„ด์€ ์ด๋ฏธ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋” ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค์ง€ ๋ง™์‹œ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ์˜ const fn ๊ฒ€์‚ฌ๊ฐ€ const fn ๋‚ด๋ถ€์—์„œ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์‹ค์ˆ˜๋กœ ํ—ˆ์šฉ/์•ˆ์ •ํ™”ํ•˜์ง€ ์•Š์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์—„๊ฒฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•ด ์ฃผ์„ธ์š”. ํ•˜์ง€๋งŒ ํ•ด๋‹น ๊ฒ€์‚ฌ๊ฐ€ ํ˜„์žฌ const rvalue ๋ณธ๋ฌธ์—์„œ ํ—ˆ์šฉ๋˜๋Š” ๊ฒ€์‚ฌ์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” 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! ๋งคํฌ๋กœ๋ฅผ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ๋งคํฌ๋กœ๋Š” non-const fns๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ(miri ์‚ฌ์šฉ?) std์˜ ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ const fn์œผ๋กœ ํ‘œ์‹œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์–ธ์ œ๋“ ์ง€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•จ์ˆ˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ์ด์ œ 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์—์„œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๊ธˆ์ง€ํ•˜๋Š” ์ฃผ์žฅ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ˜ƒ

const fn์—์„œ SystemTime::now๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ ์„ฑ๋Šฅ, ์Šค์ผ€์ค„๋Ÿฌ ๋ฐ Jupiter์˜ ์œ„์น˜์— ๋”ฐ๋ผ const FOO: [u8; SystemTime::now()] = [42; SystemTime::now()]; ์—์„œ ๋ฌด์ž‘์œ„๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋” ๋‚˜์œ:

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

TIME์˜ ๊ฐ’์ด ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ์ดํŠธ, ํŠนํžˆ ์ฆ๋ถ„ ์ปดํŒŒ์ผ ๋ฐ ํฌ๋ ˆ์ดํŠธ ์ „์ฒด์—์„œ ๋™์ผํ•˜๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋” ๋ฏธ์นœ ๊ฒƒ์€ ๊ธธ์ด๊ฐ€ 3์ธ ๋ฐฐ์—ด์—์„œ ๋ณต์ œ impl์„ ์„ ํƒํ•˜๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ฐ˜ํ™˜ ์œ ํ˜•์ด ๊ธธ์ด๊ฐ€ 4์ธ ๋ฐฐ์—ด์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋ถˆ๊ฑด์ „ํ•œ ๋ฐฉ์‹์œผ๋กœ foo.clone() ๋ฅผ ๋ง์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ž„์˜์˜ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ํ—ˆ์šฉํ•˜๋”๋ผ๋„ ์ง„์ •ํ•œ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ SystemTime::new()๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋„๋ก ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@SoniEx2 ์—ฌ๊ธฐ์—์„œ๋Š” ๋‹ค์†Œ ์ฃผ์ œ๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ํ™”๋ฌผ build.rs ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋Š˜๋‚  ์ด๋ฏธ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Cargo Book์˜ Build Scripts , ํŠนํžˆ ์ฝ”๋“œ ์ƒ์„ฑ ์‚ฌ๋ก€ ์—ฐ๊ตฌ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@oli-obk ํ•˜๋‚˜๋Š” API ์•ˆ์ „ ๋ฒ„์ „ ๊ด€๋ฆฌ์— ๊ด€ํ•œ ๊ฒƒ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋นŒ๋“œ ํ™˜๊ฒฝ์— ๊ด€ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋‘˜ ๋‹ค ์ƒํƒœ๊ณ„ ํŒŒ์†์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—๋Š” ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

const fn ์—์„œ ํ˜„์žฌ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค . ๋นŒ๋“œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“œ๋Š” ๋” ๋งŽ์€/๋” ์‰ฌ์šด ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์ข…๋ฅ˜์˜ ๋น„๊ฒฐ์ •๋ก (๋‚œ์ˆ˜, ํ˜„์žฌ ์‹œ๊ฐ„ ๋“ฑ)๋„ const fn ์— ํ—ˆ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋ฉด Rustc๋Š” ์ƒ์ˆ˜ ํ‘œํ˜„์‹์ด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋กœ ํ‰๊ฐ€๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด ์œ ํ˜• ์‹œ์Šคํ…œ์ด ๋ถ€์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ž…๋ ฅ. ์ข€ ๋” ์ž์„ธํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

https://github.com/rust-lang/rust/issues/24111#issuecomment -376352844์™€ ๊ฐ™์€ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฏธ๋ž˜์˜ ๋ฐฉ๋ฒ•์€ ํ˜„์žฌ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์™€ ์ผ๋ฐ˜ ์ˆซ์ž๋กœ ๋‚ด๋ณด๋‚ด๋Š” ๊ฐ„๋‹จํ•œ ์ ˆ์ฐจ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ํ† ํฐ. ์ ˆ์ฐจ์  ๋งคํฌ๋กœ๋Š” ๋น„ const Rust ์ฝ”๋“œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ด์‹ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹œ๊ฐ„์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์˜ ์™„์ „ํžˆ ์ œํ•œ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

@rfcbot fcp ๋ณ‘ํ•ฉ

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ณ‘ํ•ฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์€ ๋‹ค์†Œ ์ •์ƒ์ ์ธ ์˜ต์…˜์ด๊ณ  ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ฉฐ ์šฐ๋ฐœ์ ์ธ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ •๋ง ๋‚˜์œ ์ ์€ ๋งŽ์€ ํ•จ์ˆ˜ ์„ ์–ธ ์•ž์— const ๋ฅผ ๋˜์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@oli-obk ๋Œ€์‹  @rfcbot fcp merge - ์•ˆ์ •ํ™”์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ๋…ผ์˜ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŒ€์› @nrc ๊ฐ€ ์ด๋ฅผ ๋ณ‘ํ•ฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ๋‚˜๋จธ์ง€ ํŒ€์ด ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • [x] @์•„ํˆฌ๋ก 
  • [x] @cramertj
  • [ ] @eddyb
  • [x] @joshtriplett
  • [ ] @nikomatsakis
  • [x] @nrc
  • [ ] @pnkfelix
  • [x] @scottmcm
  • [x] @withoutboats

์šฐ๋ ค ์‚ฌํ•ญ:

  • ๋””์ž์ธ (https://github.com/rust-lang/rust/issues/24111#issuecomment-376829588)
  • https://github.com/rust-lang/rust/issues/24111#issuecomment -377133537์— ์˜ํ•ด ํ•ด๊ฒฐ๋œ parallel-const-traits
  • ์šฐ์„ ์ˆœ์œ„ (https://github.com/rust-lang/rust/issues/24111#issuecomment-376652507)
  • ๋Ÿฐํƒ€์ž„ ํฌ์ธํ„ฐ ์ฃผ์†Œ(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 ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฉฐ, ์ด ํ‚ค์›Œ๋“œ๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฏธ๋ž˜์— ์ถ”๋ก ๋œ ์ƒ์ˆ˜๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

1, 2, 3์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ ์ƒ์ˆ˜ ํ‰๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ ์ง‘ํ•ฉ์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ˜„์žฌ const ํ‚ค์›Œ๋“œ๋ฅผ ์•ˆ์ •ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์˜ต์…˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ผ๋งˆ ํ›„ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ฒ ์ €ํ•˜๊ฒŒ ์ „ํˆฌ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ํ—ˆ๋‹ˆ ์˜ค์†Œ๋ฆฌ ์ƒ์ˆ˜ ํ‰๊ฐ€์ž๋ฅผ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ์ถ”๋ก ๋œ const๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚™์ง„ ์œ„ํ—˜: const fn์€ ์•ผ๊ฐ„, ํŠนํžˆ ์ž„๋ฒ ๋””๋“œ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ const fn ๊ฒ€์‚ฌ๊ธฐ๋Š” ์ •์  ์ด๋‹ˆ์…œ๋ผ์ด์ € ๋ฐ ์ƒ์ˆ˜์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒ€์‚ฌ๊ธฐ์™€ ๋™์ผํ•œ ๊ฒ€์‚ฌ๊ธฐ์ž…๋‹ˆ๋‹ค(์ผ๋ถ€ ์ •์  ํŠน์ • ๊ฒ€์‚ฌ ๋ฐ ํ•จ์ˆ˜ ์ธ์ˆ˜ ์ œ์™ธ).

๋‚ด๊ฐ€ ๋ณด๋Š” ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ const ๋ฅผ ์ƒ์ž ์ „์ฒด์— ์ž์œ ๋กญ๊ฒŒ ๋ฟŒ๋ฆฌ๋Š” ๊ฒƒ์„ ์˜นํ˜ธํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ง€๊ธˆ์€ ๋ฏธ๋ž˜ ์•„์ด๋””์–ด์— ๋Œ€ํ•œ @matklad ์˜ ๊ฒŒ์‹œ๋ฌผ ์ฐธ์กฐ

@rfcbot ์€ parallel-const-traits์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์•ˆ์ •ํ™”ํ•˜๋ฉด Const ๊ฐ€ ์•ž์— ์žˆ๋Š” ๋ณ‘๋ ฌ ํŠน์„ฑ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋งŽ์€ ์ƒ์ž๊ฐ€ ์ฆ‰์‹œ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ConstDefault , ConstFrom , ConstInto , ConstClone , ConstTryFrom , ConstTryInto ๋“ฑ ConstIndex ๋“ฑ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋”์ฐํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  Try ๋กœ ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ TryFrom์„ ์•ˆ์ •ํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (https://github.com/rust-lang/rfcs/pull/2237์ž…๋‹ˆ๊นŒ? ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค).

( @nrc : ๋ด‡์ด ๊ท€ํ•˜์˜ ๊ด€์‹ฌ์‚ฌ ์ค‘ ํ•˜๋‚˜๋งŒ ๋“ฑ๋กํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค)

Parallel-const-traits๋Š” ๊ฐ€์ƒ์˜ ๋ฏธ๋ž˜ const-all-the-things ๋ฒ„์ „์—์„œ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ทธ๋ƒฅ ์ผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

const fn ์„ธ๊ณ„์—์„œ ์šฐ๋ฆฌ๊ฐ€ const fn ํŠน์„ฑ ๋ฉ”์†Œ๋“œ(์šฐ๋ฆฌ๋Š” atmํ•˜์ง€ ์•Š์Œ)๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ํŠน์„ฑ ๋ณต์ œ๋กœ ๋๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  1๋…„ ์ „ libstd๊ฐ€ ์žˆ์—ˆ๋˜ ์ƒํ™ฉ๊ณผ ์œ ์‚ฌํ•œ ๊ด€๋ จ ์ƒ์ˆ˜(์•ผ๊ฐ„)๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๊ฐœ์ธ ํ•„๋“œ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  statics/constants ๋‚ด๋ถ€์— ๋‹ค์–‘ํ•œ ์œ ํ˜•์„ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋งŽ์€ ์ƒ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ด๋ฏธ ํ•œ๋™์•ˆ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์—ˆ๊ณ  ์ผ์–ด๋‚˜์ง€ ์•Š์€ ์ผ์ž…๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ํ•˜์ž๋ฉด $#$ const fn #$ ๊ฐ€ ์—†์–ด๋„ ํ˜„์žฌ ConstDefault ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋‚˜๋จธ์ง€ ์˜ˆ์ œ( ConstFrom , ConstInto , ConstClone , ConstTryFrom , ConstTryInto ) ์ด ๊ธฐ๋Šฅ์ด ์•ˆ์ •ํ™”๋œ ์ƒํƒœ์—์„œ๋„ @oli-obk๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ const ํŠน์„ฑ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

( ConstDefault ๋Š” ์—ฐ๊ฒฐ๋œ const fn ๋Œ€์‹  ์—ฐ๊ฒฐ๋œ const ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ์ „๋ ฅ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.)

@scottmcm const fn ํŠน์„ฑ ์ •์˜๋Š” ์˜ค๋Š˜๋‚  ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(์˜ค @solson ์ด ์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค).

@eddyb ์ž„์˜์˜ ์•„์ด๋””์–ด: ํŠน์„ฑ ์ •์˜์— const fn ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹  const impl ํŠน์„ฑ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? (์ด ๋‘˜์€ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

@whitequark https://github.com/rust-lang/rfcs/pull/2237 ์€ ๊ฐ fn ์—์„œ const impl ๋ฅผ const fn ๋กœ ํ™•์žฅํ•˜๋Š” ์กฐํ•ฉ์„ ํ†ตํ•ด ๊ทธ ์•„์ด๋””์–ด๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค. impl , const ์˜ ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋„ ํ‘œ์‹œํ•˜์ง€ ์•Š๊ณ  T: const Trait ๊ฒฝ๊ณ„๋ฅผ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  const ๋ฉ”์†Œ๋“œ์™€ ํ•จ๊ป˜ impl ํ—ˆ์šฉ ํŠน์„ฑ ์ •์˜ ์ž์ฒด.

@rfcbot ์šฐ๋ ค ๋””์ž์ธ

์šฐ๋ฆฌ๋Š” ์—ญ์‚ฌ์ ์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋กœ ํŠน์ • const fn ์‹œ์Šคํ…œ์„ ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ํ˜„์žฌ๋Š” const fn trait const fn ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” $ impl ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(https://github.conf ์ฐธ์กฐ). com/rust-lang/rfcs/pull/2237์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•)
  • ์ด์™€ ๊ด€๋ จํ•˜์—ฌ T: Trait ๋ฐ”์ธ๋”ฉ๋œ const fn ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ„๋„์˜ ํŠน์„ฑ ์—†์ด , ๊ฐ€๊ธ‰์ ์ด๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์‚ฌ์šฉํ•  ๋•Œ๋งŒ (์˜ˆ: Option::map ) ์š”์ฒญํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž ์žฌ์ ์œผ๋กœ const-evaluate ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ปฌ๋ ‰์…˜ ๋ฐ ์ถ”์ƒํ™”์™€ ํ•จ๊ป˜ const fn ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „์ฒด ์ƒ์ž๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( libcore ๊ฐ€ ๋งˆ์Œ์— ์˜ด)

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์˜ ๋Œ€๋ถ€๋ถ„ ๋˜๋Š” ๋Œ€๋ถ€๋ถ„์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋””์ž์ธ ์„ ํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค(๋‹ค๋ฅธ ๊ฒƒ์„ ๋„์ž…ํ•˜๋Š” ๋น„์šฉ์œผ๋กœ). ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฃผ์„์ด ํ•„์š” ํ•˜์ง€ ์•Š๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ๋ฏธ๋ฆฌ๊ฐ€ ํ‰๊ฐ€ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

    • ์žฅ์ : ๋” ๊นจ๋—ํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค, ๊ด€๋ จ๋œ ๊ฐ’์— ๋”ฐ๋ผ ์ง€์†์ ์ธ ํ‰๊ฐ€๊ฐ€ ์ด๋ฏธ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Œ

    • ๋‹จ์ : ์–ธ์–ด ์ˆ˜์ค€์˜ ๋™์ž‘ ๋ฌธ์„œ ๋ฐ semver ๊ฒฝ๊ณ„๊ฐ€ ์—†์œผ๋ฏ€๋กœ miri์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ๋˜์ง€๊ณ  ๊ทธ๋“ค์ด ๋งŒ๋“  ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์ข…์†์„ฑ ์ค‘ ํ•˜๋‚˜์˜ ํŒจ์น˜ ๋ฒ„์ „์— ๋Ÿฐํƒ€์ž„ ๋””๋ฒ„๊ทธ ๋กœ๊น…์ด ์ถ”๊ฐ€๋จ). ๋˜ํ•œ rvalue ํ”„๋กœ๋ชจ์…˜์ด ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

  • function/impl/module/etc์— ๋”ฐ๋ผ ์œ„์˜ ๋™์ž‘์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

    • ์ด ํ•จ์ˆ˜์˜ ๋ณธ์ฒด๋Š” (์ ์–ด๋„ const fn ์ธก๋ฉด์—์„œ) ๋งคํฌ๋กœ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

    • ์žฅ์ : semver ์˜๋ฏธ๊ฐ€ ์—†๊ณ  ์ผ๋ถ€ ๋ถ„์„์˜ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

    • ๋‹จ์ : ์—ฌ์ „ํžˆ ํ›Œ๋ฅญํ•œ ๋ฌธ์„œ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์–ด๋–ค ๋™์ž‘์ด ์˜ํ–ฅ์„ ๋ฐ›์•„์•ผ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Œ( ๋‹จ์ง€ const-evaluatability?), ์‹ ์ฒด์˜ ๋ชจ๋“  ๋ณ€๊ฒฝ์€ semver-breaking์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Œ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํฌ๋ ˆ์ดํŠธ๊ฐ€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํ‰๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ ํฌ๋ ˆ์ดํŠธ์˜ ํ•จ์ˆ˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ณ  ํฌ๋ ˆ์ดํŠธ ์ž‘์„ฑ์ž๊ฐ€ ํ•จ์ˆ˜ ์„œ๋ช…์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํ‰๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@leoschwarz ์ด๊ฒƒ์€ ์ด๋ฏธ ์ž๋™ ํŠน์„ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ? ์•„๋งˆ๋„ ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ Rust-semverver๋ฅผ ํ™”๋ฌผ๊ณผ ํ†ตํ•ฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์˜๋„ํ•˜์ง€ ์•Š์€ ํŒŒ์†์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, miri์— (๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๋กœ์„œ) ์‹ค์ˆ˜๋กœ ์ดˆ๊ณผํ•˜๋Š” ํ‰๊ฐ€ ์‹œ๊ฐ„ ์ œํ•œ์ด ์žˆ์–ด ์ปดํŒŒ์ผ ์‹คํŒจ ๋‹ค์šด์ŠคํŠธ๋ฆผ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@nrc "everything-const"๊ฐ€ ์‚ฌ์‹ค์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ, ์šฐ๋ฆฌ๋Š” const ๋งŽ์€ ๊ฒƒ์„ ํ‘œ์‹œํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”๋ก ๋˜๊ธฐ๋ฅผ ์›ํ•˜๋Š”์ง€ ํ™•์‹ ์ด ์„œ์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ƒ์ˆ˜ ๋Ÿฐํƒ€์ž„ ๋˜๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๋” ๊ธด์ง€์— ๋Œ€ํ•œ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค.
์ค‘์š”ํ•œ. ๋•Œ๋กœ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‹ค์Œ์—์„œ ์ถฉ๋ถ„ํžˆ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์ปดํŒŒ์ผ ์‹œ๊ฐ„!

2018๋…„ 3์›” 28์ผ ์ˆ˜์š”์ผ ์˜คํ›„ 2:49, Josh Triplett [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 ์ด ๋ณ‘๋ ฌ ์ƒ์ˆ˜ ํŠน์„ฑ์„ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ •ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ํ•œ๊ณ„๋Š” ๊ณง ์‚ฌ๋ผ์ง„๋‹ค.

์—„์ฒญ๋‚œ. ์ด ๊ฒฝ์šฐ auto-const-fn(rust-semverver์˜ ์ผ๋ถ€ ํ†ตํ•ฉ ๋˜๋Š” ํŒŒ์†์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์œ ์‚ฌ ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜)์ด ํ›Œ๋ฅญํ•˜๊ฒŒ ๋“ค๋ฆฌ์ง€๋งŒ "๋กœ๊น… ์ถ”๊ฐ€ ๋ฐ ํŒŒ์† ์›์ธ"์€ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ์˜ฌ๋ฆด ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์œ ํ•œํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋กœ๊น… ๋ฐ ์ธ์‡„๋Š” ์ƒ์ˆ˜ ๋ชจ๋ธ์—์„œ "์ •์ƒ์ ์ธ" ๋ถ€์ž‘์šฉ์ž…๋‹ˆ๋‹ค. ๋ชจ๋‘๊ฐ€ ๋™์˜ํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์— ์“ธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์‹ค์ œ๋กœ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํ–‰๋™ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค).

๋ถ€์ž‘์šฉ์„ ๋ง์—†์ด ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด ์ •๋ง ๊ฑฑ์ •์ž…๋‹ˆ๋‹ค.

RFC๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์ƒ์ˆ˜์— "๋ถ€์ž‘์šฉ"์ด ์žˆ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฃผ์ œ๋Š” const fn ์•ˆ์ •ํ™”์™€ ์ง๊ตํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์œ ์ถ”์— ๋Œ€ํ•œ "๊ทธ๋ƒฅ semver ๊ฒฝ๊ณ ๋ฅผ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค"์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ๊ฑฑ์ •ํ•ฉ๋‹ˆ๋‹ค.
์ผ๊ด€์„ฑ. constness์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ๋ณธ ์ ์ด ์—†๋Š” ํฌ๋ ˆ์ดํŠธ ์ž‘์„ฑ์ž๊ฐ€ ๋ณธ๋‹ค๋ฉด
"๊ฒฝ๊ณ : ๋ฐฉ๊ธˆ ๋ณ€๊ฒฝํ•œ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด foo()๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์ด์ „์—๋Š” ๊ฐ€๋Šฅํ–ˆ๋˜ const ์ปจํ…์ŠคํŠธ"๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด
non-sequitur ๋ฐ ์นจ๋ฌต? ๋ถ„๋ช…ํžˆ, ์ด ๋ฌธ์ œ์˜ ์‚ฌ๋žŒ๋“ค์€ ์ž์ฃผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ const๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด. ๊ทธ๋ฆฌ๊ณ  ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํ•ด์ฃผ๋ฉด ์ข‹์„ํ…๋ฐ
(์ผ๋‹จ const_fn์ด ์•ˆ์ •๋˜๋ฉด). ๊ทธ๋Ÿฌ๋‚˜ ์˜์™ธ์˜ ๊ฒฝ๊ณ ๊ฐ€ ๋งž์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์„ ๊ฒฉ๋ คํ•˜๋Š” ๋ฐฉ๋ฒ•?

2018๋…„ 3์›” 29์ผ ๋ชฉ์š”์ผ ์˜ค์ „ 4์‹œ 36๋ถ„, Oliver Schneider [email protected]
์ผ๋‹ค:

RFC๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ทธ๋ƒฅ
์ƒ์ˆ˜์— "๋ถ€์ž‘์šฉ"์ด ์žˆ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฃผ์ œ๋Š” ์ง๊ต
์•ˆ์ •ํ™” const fn

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/24111#issuecomment-377164275 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAC3n3MtmvrDF42Iy0nhZ2q8xC-QGcvXks5tjJ0ggaJpZM4D66IA
.

๋ช…์‹œ์  const fn์€ ๋งŽ์€ API๋ฅผ ์„ฑ๊ฐ€์‹œ๊ฒŒ ํ•˜๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•”์‹œ์ ์œผ๋กœ ๊ฐ€์ •ํ•˜๋Š” ๋Œ€์‹  ์‹คํ–‰ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ๋ถ€์ž‘์šฉ์„ ๋ฒ„๋ฆฌ๋ฉด const ๋˜๋Š” non const๋ผ๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘(์˜ˆ: ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ ๋‹ค์Œ ์ฝ๊ธฐ)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • extern ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ญ์ƒ ๋ถ€์ž‘์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” const fn์œผ๋กœ ์œ ์ถ”๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ์ฝ”๋“œ์— ๋Œ€ํ•ด const fn์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์–ธ์ œ์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด monomorphization ์‹œ๊ฐ„์— ์ˆ˜ํ–‰๋ฉ๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋‚˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ๋ณ€๊ฒฝํ•ด๋„ ์‹ค์ˆ˜๋กœ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์•Œ์•„์ฑ„์ง€ ๋ชปํ•œ ์ฑ„ ์‹ค์ˆ˜๋กœ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŠนํžˆ Rust ์ƒํƒœ๊ณ„์—์„œ ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธด ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์„œ๋ช…์— ๋Œ€ํ•œ ๋ช…์‹œ์ ์ธ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ž„์„ ๋” ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ #![infer_const_fn] ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ์ƒ์ž์˜ ๋ฃจํŠธ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์ž ์ˆ˜์ค€ ๊ตฌ์„ฑ ํ”Œ๋ž˜๊ทธ๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์˜์›ํžˆ ์˜ตํŠธ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด const fn์€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํฌ๋ ˆ์ดํŠธ์—์„œ ์ถ”๋ก ๋˜๊ณ  ๋ฌธ์„œ์—๋„ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๋„ const fn์ด ๋˜์–ด์•ผ ํ•จ). ํฌ๋ ˆ์ดํŠธ ์ž‘์„ฑ์ž๊ฐ€ ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ผ์ข…์˜ ์‹ ์ค‘์„ ๊ธฐํ•˜๊ฒ ๋‹ค๋Š” ์•ฝ์† ๋ฒ„์ „ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ rust-semverver๊ฐ€ ๊ฐ•์ œ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฑฐ๊พธ๋กœ ํ•ด๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?

const fn ๋Œ€์‹  side fn์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹โ€‹โ€‹๋ช…์‹œ์ ์ด๋ฉฐ (๋ช…์‹œ์ ์œผ๋กœ ํ˜ธํ™˜์„ฑ์„ ๊นจ๊ณ  ์ธก๋ฉด fn์„ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ์ธก๋ฉด fn์„ ๋„ฃ์–ด์•ผ ํ•จ) ํ˜ผ๋ž€์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. (์ผ๋ถ€) ๋‚ด์žฅ ๋ฐ asm์ด ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ fn์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€๋Š” ์•Š์ง€๋งŒ ์—๋””์…˜์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

2018๋…„ 3์›” 30์ผ ์˜ค์ „ 2:43:06 GMT+08:00, "Soni L." [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๊ฑฐ๊พธ๋กœ ํ•ด๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?

const fn ๋Œ€์‹  side fn์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์—ฌ์ „ํžˆ ๋ช…์‹œ์ ์ž…๋‹ˆ๋‹ค(side fn์„ ํ˜ธ์ถœํ•˜๋ ค๋ฉด side fn์„ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ช…์‹œ์ ์œผ๋กœ ํ˜ธํ™˜์„ฑ์„ ๊นจ๊ณ ), ํ˜ผ๋ž€์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. (์ผ๋ถ€)
๋‚ด์žฅ ๋ฐ asm์ด ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ fn์ด ๋ฉ๋‹ˆ๋‹ค.

--
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/24111#issuecomment -377333542

--
K-9 Mail์„ ์‚ฌ์šฉํ•˜์—ฌ Android ๊ธฐ๊ธฐ์—์„œ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ฐ„๋žตํ•œ ์„ค๋ช…์„ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋” ํฐ ๋ฌธ์ œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๋ณด์ž์—๊ฒŒ ํฐ ์ถฉ๊ฒฉ์„ ์ค„ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@whitequark ๋‚˜๋Š” ๋‹จ์ง€ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ("๋ถ€์ž‘์šฉ ์—†์• ๊ธฐ")์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @oli-obk๊ฐ€ ๋ฏธ๋ž˜์˜ ํ™•์žฅ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์žˆ์—ˆ๋˜ ํ† ๋ก ์—์„œ ๋‚˜๋Š” ๋‹ค์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • "๊ฒฐ์ •๋ก ์  ๋ถ€์ž‘์šฉ"(๋ถˆ์ˆœํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ ํ•˜์ง€ ์•Š์Œ)์„ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด "์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ก"ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํŠน์ˆ˜ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ฆ๋ถ„ ์ฃผ๋ฌธํ˜• ์ปดํŒŒ์ผ์ด ๋ฐ˜๋“œ์‹œ ์ผ๊ด€๋œ ์ถœ๋ ฅ์„ ์ดˆ๋ž˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์›ํ•˜๋Š” ์™ธ๋ถ€ ๊ฒฐ์ •์„ฑ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

  • ํŠนํžˆ, ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ์กด์žฌํ•˜๊ณ  globals / C FFI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋งŒ์ง€์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ํ† ๋ก ์ด ํƒˆ์„ ํ•˜์ง€ ์•Š๋„๋ก, ์˜ˆ:

๋ถ€์ž‘์šฉ์„ ๋ฒ„๋ฆฌ๋ฉด const ๋˜๋Š” non const๋ผ๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘(์˜ˆ: ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ ๋‹ค์Œ ์ฝ๊ธฐ)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” (์•„๋งˆ๋„?) ๋ชจ๋‘ @oli-obk๊ฐ€ ๊ทธ๋Ÿฐ ๋ถ€์ž‘์šฉ์„ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์— ๊ด€ํ•ด ์ž˜๋ชป ์ด์•ผ๊ธฐํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ํฌ๋ ˆ์ดํŠธ ๋ฃจํŠธ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๋ ˆ์ดํŠธ ์ˆ˜์ค€ ๊ตฌ์„ฑ ํ”Œ๋ž˜๊ทธ๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” https://github.com/rust-lang/rust/issues/24111#issuecomment -376829588์—์„œ ์ด์ „ ์ œ์•ˆ์˜ ๋‘ ๋ฒˆ์งธ ์˜ˆ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ ์ž…๋‹ˆ๋‹ค.
๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ "๊ตฌ์„ฑ ํ”Œ๋ž˜๊ทธ"๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋Š” ๋ณด๋‹ค ์„ธ๋ถ„ํ™”๋œ ๋ฒ”์œ„ IMO๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฑฐ๊พธ๋กœ ํ•ด๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?
const fn ๋Œ€์‹  side fn์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹โ€‹โ€‹๋ช…์‹œ์ ์ด๋ฉฐ (๋ช…์‹œ์ ์œผ๋กœ ํ˜ธํ™˜์„ฑ์„ ๊นจ๊ณ  ์ธก๋ฉด fn์„ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ์ธก๋ฉด fn์„ ๋„ฃ์–ด์•ผ ํ•จ) ํ˜ผ๋ž€์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. (์ผ๋ถ€) ๋‚ด์žฅ ๋ฐ asm์ด ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ fn์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/issues/24111#issuecomment -376829588์—์„œ ์ €๋Š” ์ „์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ€ "all const fn " ๋˜๋Š” "all side fn ์ˆ˜ ์žˆ์Œ์„ ์ง€์ ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ".
ํ•จ์ˆ˜ ์„ ์–ธ์ด ์•„๋‹ˆ๋ผ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ ํ–ฅํ›„ ๋ฒ„์ „์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .
๊ทธ๋Ÿฌ๋‚˜ "๋ณธ๋ฌธ์—์„œ ์ถ”๋ก " ์‹œ๋งจํ‹ฑ์ด ์—†์œผ๋ฉด ์˜ตํŠธ์ธ side fn ์— ๋Œ€ํ•ด์„œ๋„ ํŠน์„ฑ ์ƒํ˜ธ์ž‘์šฉ์„ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์•„๋ฌด ๊ฒƒ๋„ ์–ป์ง€ ๋ชปํ•˜๊ณ  ์ž ์žฌ์ ์œผ๋กœ ์—„์ฒญ๋‚œ ๋งˆ์ฐฐ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Kenton Varda์˜ "์œ ํ•ดํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ์‹ฑ๊ธ€ํ†ค" ๊ธ€์˜ ์„น์…˜ 3.3์ด ์—ฌ๊ธฐ์— ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์†”์งํžˆ ์ „์ฒด ๋‚ด์šฉ์„ ์ฝ์„ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค).

๋””๋ฒ„๊ทธ ๋กœ๊น…์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์‹ค์ œ๋กœ ๋ชจ๋“  ์‚ฌ๋žŒ์€ ๋””๋ฒ„๊ทธ ๋กœ๊น…์ด ์ฝ”๋“œ์˜ ๋ชจ๋“  ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์ด๋ก ์  ๊ทผ๊ฑฐ๋Š” ๊ด€์‹ฌ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ œ๊ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณด์•ˆ ๊ด€์ ์—์„œ ๋””๋ฒ„๊ทธ ๋กœ๊น…์€ ์–‘์„ฑ ๋‹จ์ผ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ์ „์šฉ์ด๋ฏ€๋กœ ํ†ต์‹  ์ฑ„๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊ทธ ๋กœ๊น…์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ๊ฒฐ์ •์ง“๋Š” ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊ทธ ๋กœ๊ทธ์— ๊ธฐ๋กํ•จ์œผ๋กœ์จ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์†์ƒ๋„ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์•…์„ฑ ๋ชจ๋“ˆ์ด ๋กœ๊ทธ๋ฅผ "์ŠคํŒธ"ํ•˜๋”๋ผ๋„ ๋””๋ฒ„๊ทธ ๋กœ๊ทธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•œ ๋ชจ๋“ˆ์„ ์ •ํ™•ํžˆ ์‹๋ณ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ชจ๋“ˆ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์‰ฝ๊ฒŒ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋•Œ๋กœ๋Š” ์Šคํƒ ์ถ”์ ์„ ์ œ๊ณตํ•˜๊ธฐ๋„ ํ•จ). ๋”ฐ๋ผ์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋””๋ฒ„๊ทธ ๋กœ๊น…์ด ๊ฐ€๋…์„ฑ, ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ ๋˜๋Š” ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ์„ฑ์— ํ•ด๋ฅผ ๋ผ์น˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์œ ์‚ฌํ•œ ์ฃผ์žฅ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋””๋ฒ„๊ทธ ๋กœ๊น…์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์ด๋ก ์  ์ •๋‹นํ™”๋Š” ๋””๋ฒ„๊ทธ ๋กœ๊ทธ ๊ธฐ๋Šฅ์ด ์‹ค์ œ๋กœ๋Š” ๋””๋ฒ„๊ฑฐ์—์„œ ๊ด€์ฐฐ๋˜๋Š” ๋ฌด์ž‘๋™์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋””๋ฒ„๊ฑฐ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉด ํ•จ์ˆ˜๋Š” ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋””๋ฒ„๊น…์€ ๋ถ„๋ช…ํžˆ ์ „์ฒด ๊ฐœ์ฒด ๊ธฐ๋Šฅ ๋ชจ๋ธ์„ ๊นจ๋œจ๋ฆฌ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ๊ถŒํ•œ ์žˆ๋Š” ์ž‘์—…์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

"[๋””๋ฒ„๊น…์„ ์œ„ํ•œ] ์†”๋ฃจ์…˜์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"์— ๋Œ€ํ•œ ๋‚ด ์ง„์ˆ ์€ ์‹ค์ œ๋กœ const์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ธ์‡„ ํ˜•์‹์ด ์žˆ๋Š” ์ž ์žฌ์ ์ธ ๋ฏธ๋ž˜ API๋ฅผ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”Œ๋žซํผ๋ณ„ ์ธ์‡„ ์ž‘์—…์„ ๋ฌด์ž‘์œ„๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€(์ธ์‡„/๋””๋ฒ„๊ทธ ๋ช…๋ น๋ฌธ์ด ์žˆ๋Š” ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ const๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก) const ํ‰๊ฐ€์ž๊ฐ€ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆœ์ „ํžˆ ์˜ตํŠธ์ธ์ด๋ฉฐ ๋‹ค๋ฅธ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋™์ž‘(์˜ˆ: ๋Ÿฐํƒ€์ž„ ์‹œ const eval ๋ฐ ๋ช…๋ น์ค„/ํŒŒ์ผ ์ถœ๋ ฅ์˜ ๊ฒฝ๊ณ )์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ–์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ์˜๋ฏธ๋Š” ๋ฏธ๋ž˜์˜ RFC์— ๋‚จ๊ฒจ์ง€๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ const fn๊ณผ ์™„์ „ํžˆ ์ง๊ตํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

const impl Trait ๋ฐ T: const Trait ์— ์ค‘๋Œ€ํ•œ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

const ์ฃผ์œ„์— ์Šคํ”„๋ ˆ์ด๋ฅผ ๋” ๋งŽ์ด ๋ฟŒ๋ฆฌ๋Š” ๊ฒƒ ์™ธ์— ์ผ๋ถ€ ํŠน์„ฑ ๋ฉ”์„œ๋“œ๋งŒ const์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ง€์ •ํ•˜๋Š” ๊น”๋”ํ•œ ๊ตฌ๋ฌธ์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ where <T as Trait>::some_method is const ( is ์€ ๋ฌธ๋งฅ ํ‚ค์›Œ๋“œ์ผ ์ˆ˜ ์žˆ์Œ).

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, const fn๊ณผ ์ง๊ตํ•ฉ๋‹ˆ๋‹ค.

[u8; SizeOf<T>::Output]

const์™€ side fns๊ฐ€ ๋ถ„๋ฆฌ๋œ ๊ฒฝ์šฐ ์‹ค์ œ ์„ค๊ณ„ ๊ณ ๋ ค ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ const fns๋ฅผ ์˜ค๋Š˜๋‚  ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŠœ๋ง ์™„์ „ ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜๋Š” const fns๋ฅผ ์‹ค์ œ๋กœ const๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ชจ๋“  const fn์€ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ const ์ œ๋„ค๋ฆญ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ํ‰๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ทธ๋“ค์ด ํ˜„์žฌ ์„œ ์žˆ๋Š” const fns์— ๋Œ€ํ•ด ๊ฐœ์ธ์ ์œผ๋กœ ์ถ”๋ก ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๋ก ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ํŠœ๋ง ์™„์ „ ์œ ํ˜•, ๋งคํฌ๋กœ, ์ผ๋ฐ˜ fns ๋“ฑ์— ๋Œ€ํ•ด ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์†Œํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด๋ผ๋„ ์˜๋ฏธ๋ฅผ ์™„์ „ํžˆ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— const fn์— ๋Œ€ํ•ด ์ถ”๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

์‚ฌ์†Œํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์กฐ์ฐจ๋„ ์˜๋ฏธ๋ฅผ ์™„์ „ํžˆ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? const fn ํฌ์ธํ„ฐ, const ํŠน์„ฑ ๊ฒฝ๊ณ„์™€ ๊ฐ™์€ ํ™•์žฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? const fn ์ œ์•ˆ์„œ์—์„œ ์‚ฌ์†Œํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋ณผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋˜๋Š” const fns๋ฅผ ์‹ค์ œ๋กœ const๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ชจ๋“  const fn์€ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ const ์ œ๋„ค๋ฆญ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ํ‰๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์— ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์‚ฌ์†Œํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด const eval์„ ๋Ÿฐํƒ€์ž„ eval๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฒ˜์Œ์—๋Š” ํฐ ๊ฑฐ๋ž˜์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋ชจ๋‘ const fns์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ง ๊ธธ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ์—ฌ๋Ÿฌ ์ค„๋กœ ๋‚˜๋ˆ„๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ let ๋ช‡ ๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ 20๋ฐฐ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

@SoniEx2 ๋ฐฐ์—ด์˜ ํฌ๊ธฐ( $N in [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.
}

์ด์ œ ์ธ์ˆ˜๋ฅผ ์ทจํ•˜๋Š” const fn์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.

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 "์ตœ์†Œ const fn"์ด ๋ชจ๋“  ์ž ์žฌ์ ์ธ ํ–ฅํ›„ ํ™•์žฅ๊ณผ ํ˜ธํ™˜๋œ๋‹ค๋Š” ๊ด€์ฐฐ๋กœ ๋””์ž์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‚ด ์ดํ•ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์•ˆ์ •ํ™”๋˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž์œ  ํ•จ์ˆ˜์™€ ๊ณ ์œ  ๋ฉ”์†Œ๋“œ๋ฅผ const๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ƒ์ˆ˜ ์ปจํ…์ŠคํŠธ์—์„œ ์ƒ์ˆ˜ ์ธ์ˆ˜์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ "ํŠน์„ฑ์— ๋Œ€ํ•œ const ํšจ๊ณผ" ๋””์ž์ธ๊ณผ ๊ฑฐ์˜ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— const ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— "์ถ”๋ก ๋œ const" ๋””์ž์ธ๊ณผ๋„ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ "minimal const fn" ์ œ์•ˆ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋Œ€์ฒด ๋ฏธ๋ž˜ ๋””์ž์ธ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@nrc

rfcbot์ด ๊ท€ํ•˜์˜ everything-const ์šฐ๋ ค ์‚ฌํ•ญ์„ ๋“ฑ๋กํ•˜์ง€ ์•Š์•˜์Œ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค(๋Œ“๊ธ€๋‹น ํ•˜๋‚˜์˜ ์šฐ๋ ค ์‚ฌํ•ญ!) ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ๋‚ด ์ด์ „ ์˜๊ฒฌ(TL;DR: ํ˜„์žฌ ์ตœ์†Œ ์ œ์•ˆ)์—์„œ ํ•ด๊ฒฐ๋œ ์„ค๊ณ„ ๋ฌธ์ œ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋˜๋ฏ€๋กœ ํ–ฅํ›„ const ํ‚ค์›Œ๋“œ๋ฅผ ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ์„  ์ˆœ์œ„/๋‚™์ง„ ๋ฌธ์ œ์— ๊ด€ํ•ด์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋…ผ์˜ํ•œ ๊ฒƒ๊ณผ ์•„์ง ๋ฌธ์„œํ™”ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ๋ฌธ์„œํ™”ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • const fn foo(x: i32) -> i32 { body } ๋Š” const FOO: i32 = body; ์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์€ ์ถ”๊ฐ€์ด๋ฏ€๋กœ ๋‚™์ง„ ์œ„ํ—˜์ด ์ ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‹ค์ œ๋กœ const fn ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ์ด๋ฏธ ์•ˆ์ •์ ์ธ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์—ด์‹ฌํžˆ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž„๋ฒ ๋””๋“œ ์ž‘์—… ๊ทธ๋ฃน์€ const fn์„ ์‹ฌํ•˜๊ฒŒ ์›ํ•ฉ๋‹ˆ๋‹ค :)

๋˜ํ•œ const fn ๋ฅผ ์•ˆ์ •ํ™” ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ตœ์ ์ด ์•„๋‹Œ API๊ฐ€ ํ™•์‚ฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๋“ค์€ const fns์˜ ๋ถ€์กฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ATOMIC_USIZE_INIT ์™€ ๊ฐ™์€ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•˜์ž ๋‚˜๋Š” = random(); // ์ด ๋ฐ”์ธ๋”ฉ์˜ RHS๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ‰๊ฐ€๋˜๋ฉฐ ๋Ÿฐํƒ€์ž„์—๋Š” random์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ์—†์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์ „ํ˜€ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์ง€๋งŒ(๊ทธ๋ฆฌ๊ณ  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%๋ฅผ const eval์šฉ์œผ๋กœ ํ•œ ๋ฒˆ, ๋Ÿฐํƒ€์ž„์šฉ์œผ๋กœ ํ•œ ๋ฒˆ, ๋‘ ๋ฒˆ ์ž‘์„ฑํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๋งŽ์€ ์ƒ์ž๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

AtomicUsize::Of<value> ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ˆ, ์•Œ ์ˆ˜ ์—†๋Š” ๋ณด์žฅ์„ ๋ฐ›๋Š” ๊ฒƒ๋ณด๋‹ค ๋ชจ๋“  ๊ฒƒ์„ ๋‘ ๋ฒˆ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (๊ฒŒ๋‹ค๊ฐ€ ์ด๊ฒƒ์€ ๋ฌด์–ธ๊ฐ€๊ฐ€ const eval'๋˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

const ํ‰๊ฐ€๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด const fn์—์„œ const๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(์žฌ๊ท€์  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 ํ‰๊ฐ€๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด const fn์—์„œ const๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(์žฌ๊ท€์  const fn์˜ ๊ฒฝ์šฐ)? ์•„๋‹ˆ๋ฉด const ์ œ๋„ค๋ฆญ์„ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋“ฑ.

const fn ์˜ ์š”์ ์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋งˆ์ˆ ์ฒ˜๋Ÿผ ํ‰๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„ ์— ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Rustc๊ฐ€ llvm์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋งˆ์ˆ ์ฒ˜๋Ÿผ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ... ์ •ํ™•ํžˆ ์–ธ์ œ ocaml์—์„œ ๊ตฌํ˜„์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ Rustc์—์„œ ์ง€์†์ ์ธ ์ „ํŒŒ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

const fn ๋Š” ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ง€์†์ ์ธ ์ „ํŒŒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ˆ˜๋กœ const๊ฐ€ ์ „ํŒŒ๋  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ  llvm์ด ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ๋” ์ด์ƒ const ์ „ํŒŒํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค๋ฉด llvm์€ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ const ๋ฅผ ํ•จ์ˆ˜์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ๊ณผ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค. llvm์—๋Š” const fn ์™€ fn ์‚ฌ์ด์— ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋™์‹œ์— Rustc๋Š” const ๋ฅผ fn ์— ์ฒจ๋ถ€ํ•  ๋•Œ ๋™์ž‘์„ ์ „ํ˜€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํ•จ์ˆ˜๊ฐ€ ์œ ํšจํ•œ 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 ์ด ์˜ค๋žซ๋™์•ˆ ๋ฐค๋งˆ๋‹ค ๊ตฌ์šด ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์šฐ์„  ์ˆœ์œ„ + ๋‚™์ง„ ์šฐ๋ ค์— ๋Œ€ํ•ด ์ •๋ง๋กœ ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋‘ ์ ์€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. @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 ์—ฌ์•ผ ํ•ฉ๋‹ˆ๊นŒ?

    • ๋‹ค์‹œ, ์˜ตํŠธ ์•„์›ƒ์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ const eval ๋™์•ˆ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋ฏธ๋ž˜ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŠน์ • ๋””์ž์ธ์„ ์ œ์•ˆํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์•Œ๋ ค์ง„ ๋ช‡ ๊ฐ€์ง€ ๊ทธ๋Ÿด๋“ฏํ•œ ๋ฐฉํ–ฅ์„ ๋‚˜์—ดํ–ˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.
์›๋ž˜ ์•„์ด๋””์–ด๋Š” const ์— ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ  ์ผ๋ฐ˜ํ™”๋œ "๊ธฐ๋Šฅ์˜ ๋ณธ๋ฌธ ๋…ธ์ถœ" ์†์„ฑ์ด์—ˆ์ง€๋งŒ ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ๋ณ€ํ˜•์ด ์žˆ์œผ๋ฉฐ ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ์ข‹์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค .

ํŽธ์ง‘ : (์ด ์‚ฌ์‹ค์„ ์žŠ๊ณ  ์‹ถ์ง€ ์•Š์Œ) @solson ์€ Lean์ด @pattern ์™€ ๊ฐ™์€ ์†์„ฑ์„ ๊ฐ–๊ณ  ์žˆ์–ด ํ•จ์ˆ˜ ๋ณธ๋ฌธ์—์„œ ๋‹ค์–‘ํ•œ ๊ฒƒ์„ ์ž๋™์œผ๋กœ ํŒŒ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

@oli-obk unsafe ๋Š” ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์†์„ฑ์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ํ˜„์žฌ async ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  try { .. } try fn ๋ฅผ ๋„์ž…ํ•˜๋ฉด ์†์„ฑ ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ํšจ๊ณผ์™€ ๊ฐ™์€ ์ผ์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์†์„ฑ ์‚ฌ์šฉ ์—ฌ๋ถ€. #[target_feature(..)] ๋Š” ์ „์ฒด์ ์ธ ์ผ๊ด€์„ฑ์— ์ฃผ๋ฆ„์„ ์ค๋‹ˆ๋‹ค.

์ถ”์‹ : 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 eval ์ฝ”๋“œ ๊ฐ„์— ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ๋Ÿฐํƒ€์ž„์— ์œ ํ˜• ์‹œ์Šคํ…œ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์˜์กด์  ํƒ€์ดํ•‘์ด๋ฉฐ, ๋Ÿฐํƒ€์ž„์— const fn ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋™์•ˆ ์˜ค๋Š˜๋‚ ์—๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@oli-obk ํŠน์„ฑ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ํŠธ๋ ˆ์ดํŠธ์˜ impl ์ค‘ ์ผ๋ถ€ ์—์„œ๋งŒ const fn ์ธ ํŠธ๋ ˆ์ดํŠธ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์•„์ด๋””์–ด ์—†์ด const fn ๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@eddyb ๋Š” ์ƒˆ๋กœ์šด const ๊ฒฝ๊ณ„์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. :)

@Centril ๋‚ด ์š”์ ์€ ์†์„ฑ ์ œ์•ˆ(ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด)์ด ํŠน์„ฑ ๋ฉ”์†Œ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ›จ์”ฌ ๋” ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ดˆ๋ž˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋ฉฐ, ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋น„๊ต ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค .
ํ˜„์žฌ์˜ const fn ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐ„๋‹จํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ํ™•์žฅํ•  ๋•Œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

์ผ๋ฐ˜ const + const ์ œ๋„ค๋ฆญ:

intrinsic const SizeOf<T>: usize;

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

@eddyb ์ €๋Š” const fn ๋””์ž์ธ๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋˜๋Š” ๋‹ค์–‘ํ•œ ์†”๋ฃจ์…˜์„ ์—ผ๋‘์— ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์“ธ ๊ฒƒ์ด๋‹ค.

์™€, ์ด์ œ ๋ง‰ ์‹œ์ž‘ํ•œ์ง€ โ€‹โ€‹2๋…„์ด ๋œ ๊ฑธ ๋ดค์Šต๋‹ˆ๋‹ค. ์•ˆ์ •ํ™” ๋‚ ์งœ๊ฐ€ ์˜ˆ์ƒ๋ฉ๋‹ˆ๊นŒ? ์ด ํ™•์žฅ์ด ์•ˆ์ •ํ™”๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ๊ตฌ๊ฐ„ ์—์„œ ๊ฑฐ์˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. :)

@rfcbot ์€ ๋Ÿฐํƒ€์ž„ ํฌ์ธํ„ฐ ์ฃผ์†Œ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฌธ์ œ์—์„œ๋Š” const fn ์—์„œ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์„ ์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด ์ œ๊ธฐ๋˜์—ˆ์œผ๋ฉฐ ์›์‹œ ํฌ์ธํ„ฐ์˜ ์ฃผ์†Œ๊ฐ€ ๋น„๊ฒฐ์ •๋ก ์  ์˜ค๋ผํด๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. https://github.com/rust- lang/rust/issues/49146#issuecomment -386727325. ์—ฌ๊ธฐ์— ์„ค๋ช…๋œ ์†”๋ฃจ์…˜์ด ์žˆ์ง€๋งŒ ์•ˆ์ •ํ™” ์ „์— ์ผ๋ถ€ ์›์‹œ ํฌ์ธํ„ฐ ์ž‘์—…์„ 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์ด์ง€๋งŒ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค(์‚ฌ์šฉ์„ ํฌ์ธํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„/ํ‰๊ฐ€ ์‹œ๊ฐ„์— ์ด๋ฏธ ํฌ์ธํ„ฐ๋ฅผ ์ถ”์ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).

float ๋น„ํŠธ์˜ ๊ฒฝ์šฐ NaN ์ •๊ทœํ™”?

๋‚˜๋Š” ๊ทธ ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ๊ฒฐ์ •์ ์œผ๋กœ ๋งŒ๋“ค ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด NaN ํŽ˜์ด๋กœ๋“œ ๋•Œ๋ฌธ์— float ๋น„ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ ๋˜ํ•œ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์™„์ „ํ•œ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์„ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  float ์—ฐ์‚ฐ์„ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฒฐ์ •๋ก ์€ ์–ด๋ ต๋‹ค

์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ LLVM์˜ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ๋ถ€๋™ ์—ฐ์‚ฐ์˜ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฒฐํ•ฉ๋œ opcode๊ฐ€ ์žˆ๋Š” ์—ฐ์‚ฐ์„ ~์ˆ˜ํ–‰~ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์€ ์‹ค์ œ ์ฐจ์ด๊ฐ€ ๋ฏธ๋ฏธํ•˜๋”๋ผ๋„ ์ž‘์—… ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ด๋Š” miri๊ฐ€ llvm ์ตœ์ ํ™”๋˜์ง€ ์•Š์€ mir๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ˜๋ฉด ๋Œ€์ƒ์€ ๊ธฐ๋ณธ ์ฝ”๋“œ์™€ ๋‹ค๋ฅธ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๊ฐ–๋Š” llvm์— ์ตœ์ ํ™”๋˜๊ณ  ์žฌ์ •๋ ฌ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€์— ๋Œ€ํ•œ ๊ฒฐ์ •์ด ๋‚ด๋ ค์งˆ ๋•Œ๊นŒ์ง€ ํ˜„์žฌ๋กœ์„œ๋Š” float๊ฐ€ ์—†๋Š” ์ฒซ ๋ฒˆ์งธ ์•ˆ์ •์ ์ธ const fn ๊ธฐ๋Šฅ์— ๋™์˜ํ•˜์ง€๋งŒ const fn์ด ํ•ด๋‹น ๋…ผ์˜๋กœ ์ธํ•ด ๋Š๋ ค์ง€๊ฑฐ๋‚˜ ์ฐจ๋‹จ๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ LLVM์˜ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ๋ถ€๋™ ์—ฐ์‚ฐ์˜ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณ€๊ฒฝํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฒฐํ•ฉ๋œ opcode๊ฐ€ ์žˆ๋Š” ํ“จ์ฆˆ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์‹ค์ œ ์ฐจ์ด๊ฐ€ ๋ฏธ๋ฏธํ•˜๋”๋ผ๋„ ์ž‘์—… ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

Fusing ์—ฐ์‚ฐ(๋‚˜๋Š” ๋‹น์‹ ์ด mul-add๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๊ณ  ๊ฐ€์ •)์€ ๊ฒฐ๊ณผ์˜ ๋ฐ˜์˜ฌ๋ฆผ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— fast-math ํ”Œ๋ž˜๊ทธ ์—†์ด๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. LLVM์€ IEEE ํ˜ธํ™˜ ํ•˜๋“œ์›จ์–ด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•  ๋•Œ "๊ธฐ๋ณธ ๋ถ€๋™ ์†Œ์ˆ˜์  ํ™˜๊ฒฝ"์—์„œ ์„ค์ •ํ•œ ์ œํ•œ ๋‚ด์—์„œ ๋ถ€๋™ ์†Œ์ˆ˜์  ์—ฐ์‚ฐ์˜ ์ •ํ™•ํ•œ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งค์šฐ ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค.

LLVM์ด ๋ณด์กดํ•˜๋ ค๊ณ  ํ•˜์ง€ ์•Š๋Š” ๋‘ ๊ฐ€์ง€๋Š” NaN ํŽ˜์ด๋กœ๋“œ์™€ NaN์˜ ์‹ ํ˜ธ์„ฑ์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ๊ธฐ๋ณธ fp ํ™˜๊ฒฝ์—์„œ ๊ด€์ฐฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ธˆ์ง€ํ•ด์•ผ ํ•˜๋Š” float์˜ ๋น„ํŠธ๋ฅผ ๊ฒ€์‚ฌํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  LLVM์ด ์ด์— ๋Œ€ํ•ด ๋” ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์˜€๋‹ค ํ•˜๋”๋ผ๋„ ํ•˜๋“œ์›จ์–ด๋Š” NaN ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๋„ ๋‹ค์–‘ํ•˜๋ฏ€๋กœ LLVM์— ๊ณ ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.)

์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ฒฐ์ •์ด ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์ฃผ์š” ์‚ฌ๋ก€๋Š” x87 (SSE ์ด์ „) ์ฝ”๋“œ์—์„œ ์œ ์ถœ ๋ฐ ๋‹ค์‹œ ๋กœ๋“œ์˜ ์œ„์น˜์ž…๋‹ˆ๋‹ค. x87์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ์˜ ๊ฒฝ์šฐ 80๋น„ํŠธ๋กœ ๋ฐ˜์˜ฌ๋ฆผํ•˜๊ณ  ์ €์žฅ์†Œ์˜ ๊ฒฝ์šฐ 32 ๋˜๋Š” 64๋น„ํŠธ๋กœ ๋ฐ˜์˜ฌ๋ฆผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐ˜์˜ฌ๋ฆผ๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๊ฐ FPU ๋ช…๋ น ์ „์— ๋ฐ˜์˜ฌ๋ฆผ ๋ชจ๋“œ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์‹ค์šฉ์ ์ด์ง€ ์•Š์œผ๋ฏ€๋กœ (๋‚ด ์ƒ๊ฐ์—) LLVM์€ ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์™„์ „ํ•œ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ

๋‚ด ๊ฒฌํ•ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์™„์ „ํ•œ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ๊ณผ ํ•จ๊ป˜ ๊ฐ€์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์ด ํŽธ๋ฆฌํ•จ/์™„๋ฒฝ ํ•จ๋ณด๋‹ค ์•ˆ์ „/์ •ํ™•ํ•จ ์„ ์„ ํƒํ•œ๋‹ค๋Š” ์ „๋ฐ˜์ ์ธ Rust ๋ฉ”์‹œ์ง€์™€ ์–ด์šธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์€ ๋“ฑ์‹ ์ถ”๋ก ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋งŽ์€ ์ถ”๋ก  ์ด์ ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(์ตœํ•˜์œ„๊นŒ์ง€์ง€๋งŒ ๋น ๋ฅด๊ณ  ๋Š์Šจํ•œ ์ถ”๋ก ์€ ๋„๋•์ ์œผ๋กœ ์˜ณ ์Šต๋‹ˆ๋‹ค).

๊ทธ๋Ÿฌ๋‚˜ ๋ฌผ๋ก  ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์™„์ „์„ฑ wrt ์†์‹ค. 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์—์„œ ์ถ”์ ๋œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€ํ™˜์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— 0์ด ๋ฉ๋‹ˆ๋‹ค(์ฆ‰, const ํ‰๊ฐ€์—์„œ). ๋น„ const ํ‰๊ฐ€์—์„œ๋Š” ๋ฌด์—‡์ด๋“  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ถ”์  ํฌ์ธํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํฌ์ธํ„ฐ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ํ• ๋‹นํ•  ๋•Œ VM์€ ํฌ์ธํ„ฐ ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•˜์ง€๋งŒ ํฌ์ธํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์™€ ์กฐํšŒ ํ…Œ์ด๋ธ”์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์กฐํšŒ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ์˜ ๊ฐ’(์ฆ‰, ํฌ์ธํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ”์ดํŠธ)์„ ์–ป์œผ๋ฉด 0์„ ์–ป์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๊ฐ์ฒด์˜ ๊ธฐ๋ณธ ํฌ์ธํ„ฐ๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

Box::new๋Š” VM์—์„œ ์ถ”์ ๋œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—์„œ์™€ ๊ฐ™์ด ์ด๊ฒƒ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์‹คํ–‰๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? VM์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ฆฌ๋Š” ์ด๋ฏธ ์ด ๋ชจ๋“  ๊ฒƒ์„ ํ›Œ๋ฅญํ•˜๊ณ  ์™„์ „ํžˆ ๊ฒฐ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋˜ํ•œ const fn ๋ฐ ๋Ÿฐํƒ€์ž„ ๊ฒฐ์ •์— ๋Œ€ํ•œ ์šฐ๋ ค๋กœ ๋Œ์•„๊ฐ€์„œ: ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์›ํ•œ๋‹ค๋ฉด(์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ• ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์—ฌ์ „ํžˆ ์šฐ๋ฆฌ๊ฐ€ ์™œ ์‹ ๊ฒฝ์„ ์“ฐ๋Š”์ง€ ์„ค๋ช…ํ•ด์ค„ ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :D ), ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ptr-to-int ๋ฐ float-to-bits๋Š” ๋น„ const ์—ฐ์‚ฐ์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@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-to-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.

foo as *const _ as usize as *const _ ๋ฅผ ๊นจ๋Š” @SoniEx2

๋™๊ธฐ ๋ถ€์—ฌ:
์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋™์ž‘๊ณผ ๋‹ค๋ฅธ ๋Ÿฐํƒ€์ž„ ๋™์ž‘ ๋˜๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ const fn์ด ๋น„๊ฒฐ์ •์ ์ด๋ผ๋Š” ๋ฌธ์ œ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์•ˆ์ „์€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์Œ์€ ์™„์ „ํžˆ ์ž˜๋ชป๋œ ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„ ํ‰๊ฐ€์—์„œ ์™„์ „ํžˆ ํฌ์ฐฉํ•˜๊ณ  ์žˆ๋Š” ๋†€๋ผ์šด ๋™์ž‘์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๊ธฐ๋Šฅ์—์„œ ์ด๋ฏธ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋†€๋ผ์šธ ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. 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-to-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 ๋“ฑ์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. github.com/rust-lang/rfcs/pull/2237 ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค...) ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ด์— ๋Œ€ํ•œ ์ข‹์€ ์ƒ๊ฐ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ•„ ์™€๋“ค๋Ÿฌ(Phil Wadler)์™€ ์ฝ”๋„ˆ ๋งฅ๋ธŒ๋ผ์ด๋“œ(Conor McBride)์˜ ๋ถˆํ›„์˜ ๋ช…์–ธ:

๋‚˜๋Š” ์ˆœ์ˆ˜ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ถ€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?
โ€”ํ•„๋ฆฝ ์™€๋“ค๋Ÿฌ [60]

์šฐ๋ฆฌ๋Š” '์˜ˆ'๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์ˆœ๋„๋Š” ํ˜„์ง€์—์„œ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@oli-obk

๋™์ผํ•œ ์ธ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„ ๋Ÿฐํƒ€์ž„ ๋˜๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ const fn ์— ๋Œ€ํ•ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด ๋†€๋ผ์šด ๋™์ž‘์„ ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋ถ€๋Ÿฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณด์ˆ˜์ ์ธ ์˜ต์…˜์œผ๋กœ const fn ๋ฅผ ์ฐธ์กฐ ํˆฌ๋ช…์œผ๋กœ ์•ˆ์ •ํ™”ํ•˜์—ฌ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ/์ˆœ๋„์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ์—ฐ๊ธฐํ•˜๊ณ  unsafe (๋˜๋Š” const ๊ฐ€ ์•„๋‹˜)๋ฅผ ์œ„๋ฐ˜ํ•˜๋„๋ก ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ๊ฐ€์ •ํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ๊ฒฝํ—˜์„ ์Œ“์•˜์„ ๋•Œ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฒฝํ—˜์„ ์–ป๋Š” ๊ฒƒ์—๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋น„๊ฒฐ์ •๋ก ์„ ํ™œ์šฉํ•˜๋ ค ํ•˜์ง€๋งŒ ์‹คํŒจํ•˜๊ณ , ์ด๋ฅผ ๋ณด๊ณ ํ•˜๊ณ  ๊ทธ๋“ค์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ, ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ const ํ‰๊ฐ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

const์—์„œ int๋ฅผ ptr๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ํฐ ์†์‹ค์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„๋“œ ์˜คํ”„์…‹์„ ์–ป๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•ด ๋ณด์ด๋ฉฐ ๊ทธ๊ฒƒ์ด ์ œ๊ฐ€ ๋ณด์กดํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@SoniEx2 ํ•จ์ˆ˜์— const ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๋™์ž‘์„ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฉฐ ์ด๊ฒƒ์ด ๋ณธ์งˆ์ ์œผ๋กœ ๊ท€ํ•˜์˜ ์ œ์•ˆ์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.

@centril ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋ณด์ˆ˜์ ์ธ ์ผ์„ ํ•ฉ์‹œ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ๋“ค์„ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋ถˆ์•ˆ์ •ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ libstd๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ๋‚˜์ค‘์— ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ•ญ์ƒ ํ†ตํ•ฉ์„ ๋„์ž…ํ•˜๊ณ  ๋ฉ‹์ง„ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ๋ถ„์„์„ ๋ฒฝ๋Œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์šฐํšŒ ๋ณ€ํ™˜์„ UB๋กœ ๋งŒ๋“ค์–ด ๋‚˜์ค‘์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„์—๋„ ์—ฌ์ „ํžˆ ๋™์ผํ•  ๊ฒƒ์ด๊ณ , const๋Š” const ์‹œ๊ฐ„์—๋งŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š”... const ์—†์ด๋„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

const fns๊ฐ€ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ ์•จ๋ฆฌ์–ด์‹ฑ ๊ทœ์น™์„ ๊ฐ€์ง„ ํ•˜์œ„ ์–ธ์–ด๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

@Centril @est31 ํด๋กœ๋กœ ํŠธ๋ฆฌํ”Œ๋ฃจ์˜ค๋กœ์—ํ‹ธ๋ Œ์ด ๋ฌด์—‡๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@sgrif CTFE(์ปดํŒŒ์ผ ์‹œ๊ฐ„ ํ•จ์ˆ˜ ํ‰๊ฐ€)๋Š” ์˜ค๋žซ๋™์•ˆ Rust์— ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์ด ์Šค๋ ˆ๋“œ์˜ ์˜ค๋ž˜๋œ ๋ถ€๋ถ„ ํฌํ•จ). ์ด๋ฏธ ์ค‘์‹ฌ ์–ด๋”˜๊ฐ€์— ์ •์˜๋˜์–ด์•ผ ํ•˜๋Š” ์šฉ์–ด ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

@sgrif lol ๋Œ€๋ถ€๋ถ„ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค ์ €๋Š” "์ง€๊ธˆ ์–ด๋–ค ์ด์ƒํ•œ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?"๋ผ๊ณ  ๊ถ๊ธˆํ•ดํ•˜๋Š” ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค. IRC์—์„œ @eddyb ๊ฐ€ "CTFE"๋ฅผ ์–ธ๊ธ‰ํ–ˆ์„ ๋•Œ ๋‚˜๋Š” ๊ทธ์—๊ฒŒ ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๋ฌผ์–ด์•ผ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.p.

์ด ํŽ˜์ด์ง€์˜ @eddyb ctrl+f + CTFE๋Š” ์ด๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“ , ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์—ฌ๊ธฐ ํ† ๋ก ์— ์ฐธ์—ฌํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์กฐ์‚ฌ๋ฅผ ํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ์ฃผ๋กœ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. "์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค"๋Š” ์ƒ๋‹นํžˆ ๋ฐฐ์ œ์ ์ธ IMO์ž…๋‹ˆ๋‹ค.

@Centril @est31 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :heart:

๊ทธ๋ž˜์„œ...์— ๋Œ€ํ•œ ์–ด๋–ค ์ƒ๊ฐ

์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ•ญ์ƒ ํ†ตํ•ฉ์„ ๋„์ž…ํ•˜๊ณ  ๋ฉ‹์ง„ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ๋ถ„์„์„ ๋ฒฝ๋Œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์šฐํšŒ ๋ณ€ํ™˜์„ UB๋กœ ๋งŒ๋“ค์–ด ๋‚˜์ค‘์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ const fn ๋‚ด๋ถ€์˜ ๊ณต์šฉ์ฒด ํ•„๋“œ ์•ก์„ธ์Šค๋„ ๋ถˆ์•ˆ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€์˜ ctrl+f + CTFE๋Š” ์ด๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” Rust์˜ ๋””์ž์ธ ๋ฐ ๊ฐœ๋ฐœ์—์„œ ์ด 1.0 ์ด์ „ ๋ฌธ์ œ๋ณด๋‹ค ๋จผ์ € ์‚ฌ์šฉ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์šฉ์–ด์— ๋Œ€ํ•œ ์ค‘์‹ฌ ๋ฌธ์„œ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์Šฌํ”„๊ฒŒ๋„ ์ฐธ์กฐ์˜ ์šฉ์–ด์ง‘ ์ด ์ •๋ง ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
HRTB ๋ฐ NLL์€ ๋” ์ตœ์‹ ์ด์ง€๋งŒ ์ธ๋ผ์ธ์œผ๋กœ ์„ค๋ช…๋˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ์•ฝ์–ด์˜ ๋‘ ๊ฐ€์ง€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์–ด๋–ค ํ† ๋ก ๋„ ๋ฐฐ์ œ๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์ง€๋งŒ @Centril ์ด๋‚˜ @est31 ์—๊ฒŒ CTFE๋ฅผ ์ •์˜ํ•˜๋„๋ก ์š”์ฒญํ•˜๋Š” ๊ฒƒ์€ ๊ณตํ‰ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์• ์ดˆ์— ๋‘๋ฌธ์ž์–ด๋ฅผ ๋„์ž… ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์Šฌํ”„๊ฒŒ๋„ GitHub์—์„œ ๋ฐ˜๋“œ์‹œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ํ•˜์œ„ ๋ ˆ๋”ง์—์„œ ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ด‡์ด ์ตœ์ƒ์œ„ ์ฃผ์„์„ ์ž‘์„ฑํ•˜๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์•ฝ์–ด์— ๋Œ€ํ•œ ํ™•์žฅ ๋ชฉ๋ก๊ณผ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค . ํ† ๋ก ์— ํ‘œ์‹œ๋˜๋Š” ํ•˜์œ„ ๋ ˆ๋”ง.

๋˜ํ•œ CTFE์— ๋Œ€ํ•œ ๋‘ ๊ฐœ์˜ ์œ„ํ‚คํ”ผ๋””์•„ ๊ธฐ์‚ฌ("ํด๋กœ๋กœํŠธ๋ฆฌํ”Œ๋ฃจ์˜ค๋กœ์—ํ‹ธ๋ Œ" ๋ฐ "์ปดํŒŒ์ผ ์‹œ๊ฐ„ ํ•จ์ˆ˜ ์‹คํ–‰")๊ฐ€ ์ฒ˜์Œ ๋‘ ๊ฐœ์˜ ๊ฒฐ๊ณผ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ Google ๋ฒ„๋ธ”์— ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ „์ž๋Š” "์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„ ํ•จ์ˆ˜ ์‹คํ–‰์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค."๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

( ๋งจ ์œ„์— CTFE ์œ„ํ‚ค ๋งํฌ๋ฅผ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ const fn s๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? :P)

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Rustc ๊ฐ€์ด๋“œ ์šฉ์–ด์ง‘์— CTFE๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(์ €๋Š” ๋ชจ๋ฐ”์ผ์ž…๋‹ˆ๋‹ค)?

๋˜ํ•œ ์ตœ์†Œ๊ฐ’์„ ์•ˆ์ •ํ™”ํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ ๋งŽ์ด ๋ถ€๋”ชํžˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. const if ๋ฐ match ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@์„ผํŠธ๋ฆด

๋™์ผํ•œ ์ธ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„ ๋Ÿฐํƒ€์ž„ ๋˜๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ const fn์— ๋Œ€ํ•ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด ๋†€๋ผ์šด ๋™์ž‘์„ ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋ถ€๋Ÿฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์ž‘์„ฑํ•œ even ๋Š” ํฌ์ธํ„ฐ์˜ ๋น„ํŠธ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— CTFE ์‹œ๊ฐ„์— ์‹คํ–‰ํ•˜๋ฉด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. (์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ์‹ฌ์ง€์–ด ์ •๋ ฌ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ๊ฒฐ์ •๋ก ์ ์œผ๋กœ ๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ท ์ผ์„ฑ ํ…Œ์ŠคํŠธ๊ฐ€ ๋น„ํŠธ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋œ๋‹ค๋ฉด "full miri"๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „์ฒด ์ตœํ•˜์œ„ ๋ฐ”์ดํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. ๋งˆ์ง€๋ง‰ ๋น„ํŠธ.)
์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์—๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์˜ค๋ฅ˜๋กœ ์˜ค๋ฅ˜ ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„์—๋Š” ์„ฑ๊ณตํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์„ ์™„๋ฃŒํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

CTFE๊ฐ€ ๊ฒฐ๊ณผ๋กœ ์„ฑ๊ณตํ•˜๋ฉด ํ•จ์ˆ˜์˜ ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋กœ ์„ฑ๊ณตํ•˜๋„๋ก ๋ณด์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์•ฝํ•œ ๋ณด์ฆ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@oli-obk

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋ณด์ˆ˜์ ์ธ ์ผ์„ ํ•ฉ์‹œ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ๋“ค์„ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋ถˆ์•ˆ์ •ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ libstd๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ๋‚˜์ค‘์— ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งฅ๋ฝ์„ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ "์ด๊ฒƒ๋“ค"์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ˜„์žฌ ์šด ์ข‹๊ฒŒ๋„ CTFE ๋ฏธ๋ฆฌ๋Š” ์‚ฐ์ˆ , ๋น„๊ต, ๋ชจ๋“  ์˜ค๋ฅ˜์™€ ๊ฐ™์€ ํฌ์ธํ„ฐ ๊ฐ’์— ๋Œ€ํ•œ ์ž‘์—…์„ ์™„์ „ํžˆ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ณ„์‚ฐ์— ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋œ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ CTFE ์‹œ๊ฐ„์— ์ˆ˜ํ–‰๋œ ๊ฒ€์‚ฌ์ด๋ฉฐ, ํ•ฉ์ง‘ํ•ฉ์œผ๋กœ ์šฐํšŒํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์–ด์จŒ๋“  ์‚ฐ์ˆ /๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฝ”๋“œ ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ๋”ฐ๋ผ์„œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ณด์ฆ์„ ์ถฉ์กฑํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

CTFE๊ฐ€ ํฌ์ธํ„ฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๊ณ„์‚ฐ๋œ ํฌ์ธํ„ฐ ๊ฐ’์ด ์–ด๋””์—์„œ๋‚˜ ์˜๋ฏธ๊ฐ€ ์žˆ์„๊นŒ์š”? ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๋น„ํŠธ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ์ธํ„ฐ ๊ฐ’์„ ํฌํ•จํ•˜์ง€ ์•Š๋„๋ก ๊ณ„์‚ฐํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ด๋ฏธ ํ™•์ธํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ CTFE miri์— ์—ฐ์‚ฐ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์‹ค @eddyb ์˜ offset_of [1]์— ํ•„์š”ํ•œ ๊ฒƒ์€ ํฌ์ธํ„ฐ ๋นผ๊ธฐ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ฝ”๋“œ๋Š” "full miri"์— ์กด์žฌํ•˜๋ฉฐ ๋‘ ํฌ์ธํ„ฐ๊ฐ€ ๋™์ผํ•œ ํ• ๋‹น ๋‚ด์— ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์œ„์˜ ๋ณด์ฆ์„ ์œ ์ง€ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ @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 -> ๋น„ํŠธ ๋ณ€ํ™˜ ๋ฐ ํฌ์ธํ„ฐ -> ๋ณ€ํ™˜ ์‚ฌ์šฉ์ž…๋‹ˆ๋‹ค.

CTFE๊ฐ€ ๊ฒฐ๊ณผ๋กœ ์„ฑ๊ณตํ•˜๋ฉด ํ•จ์ˆ˜์˜ ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋กœ ์„ฑ๊ณตํ•˜๋„๋ก ๋ณด์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์•ฝํ•œ ๋ณด์ฆ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ ๋Ÿฐํƒ€์ž„์— ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๋Š” ๋™์ผํ•œ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํ‰๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ˆœ๋„๊ฐ€ ๋ณด์žฅ๋ฉ๋‹ˆ๊นŒ?

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์šฐ๋ฆฌ์˜ ์‚ถ์ด ๋ฐฑ๋งŒ ๋ฐฐ ๋” ์‰ฌ์›Œ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ํ—ˆ์ ์„ ๋‚จ๊ธฐ๊ฑฐ๋‚˜ ํš๊ธฐ์ ์ธ ๋ฐฉ์‹์œผ๋กœ const fn์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋น„๊ฒฐ์ •๋ก ์„ ๋ฐฉ์ง€ํ•  ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋Ÿฐํƒ€์ž„์— ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๋Š” ๋™์ผํ•œ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํ‰๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ˆœ๋„๊ฐ€ ๋ณด์žฅ๋ฉ๋‹ˆ๊นŒ?

์˜ˆ, ๊ทธ๊ฒƒ์ด ์ œ๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


์ข€ ๋” ์ƒ๊ฐํ•ด๋ณด๋ฉด(๊ทธ๋ฆฌ๊ณ  ์ด ๊ธ€์„ ์“ฐ๋Š” ๋™์•ˆ @oli- obk ์˜ ๋‹ต์žฅ์„ ์ฝ์œผ๋ฉด์„œ) "์•ˆ์ „ํ•œ const fn ๋Š” ๋‹ค์Œ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํšจํ•œ ์ธ์ˆ˜์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋  ๋•Œ CTFE ์‹œ๊ฐ„(ํŒจ๋‹‰ ์ œ์™ธ)". ์ผ์ข…์˜ "const ์•ˆ์ „" ๋ณด์žฅ. ๋Ÿฐํƒ€์ž„ ๋™์ž‘๊ณผ ์ผ์น˜ํ•˜๋Š” ์„ฑ๊ณต์ ์ธ CTFE์— ๋Œ€ํ•ด ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ณด์žฅ๊ณผ ํ•จ๊ป˜ ์•ˆ์ „ํ•œ const fn ๊ฐ€ ์„ฑ๊ณต์ ์ธ CTFE ์‹คํ–‰๊ณผ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์— ๊ฒฐ์ •์ ์ด๋ผ๋Š” ๋ณด์žฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ป๊ธฐ ์–ด๋ ค์šด ๋ณด์ฆ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ข‹๋“  ๋‚˜์˜๋“  Rust๋Š” CTFE miri๊ฐ€ ๊ฒฐ์ •๋ก ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ํ•ญ์ƒ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ๋ณด์žฅํ•  ์ˆ˜ ์—†๋Š” ๋‹ค์–‘ํ•œ ์•ˆ์ „ํ•œ ์—ฐ์‚ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด @Centril ์˜ oracle ๋ณ€์ข…์€ ์ตœํ•˜์œ„ ๋ฐ”์ดํŠธ๊ฐ€ 0์ธ์ง€ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. ๊ด€์ ์—์„œ ์ด ์„ค์ •์—์„œ CTFE์˜ "์œ ํšจํ•œ ๊ฐ’ usize "์€ PrimVal::Bytes ์ธ ๊ฐ’๋งŒ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ˜๋ฉด PrimVal::Ptr ๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค[1]. const ์ปจํ…์ŠคํŠธ์—์„œ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์œ ํ˜• ์‹œ์Šคํ…œ์ด ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ €๋Š” miri๊ฐ€ ํ•˜๋Š” ์ผ์„ ๋ณ€๊ฒฝํ•  ๊ฒƒ์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ const fn ์— ์ฒจ๋ถ€๋  ๋•Œ ๋‹ค์–‘ํ•œ Rust ์œ ํ˜•์ด "์˜๋ฏธ"ํ•˜๋Š” ๊ฒƒ์„ ๋ณ€๊ฒฝํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜• ์‹œ์Šคํ…œ์€ CTFE์—์„œ ๋ชจ๋“  ์•ˆ์ „ํ•œ ์‚ฐ์ˆ  ๋ฐ ๋น„ํŠธ ์—ฐ์‚ฐ์ด ์ž˜๋ชป๋  ์ˆ˜ ์—†๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. CTFE ์œ ํšจ ์ž…๋ ฅ์˜ ๊ฒฝ์šฐ ์–‘์ชฝ์ด PrimVal::Bytes ์ด๋ฏ€๋กœ CTFE์—์„œ ์ •์ˆ˜ ๋นผ๊ธฐ๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก , ptr-to-int๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์˜ ์œ ํ˜•์ด usize ์ด์ง€๋งŒ CTFE ์œ ํšจ usize ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์„ค์ •์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ž‘์—…์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์‹ ๊ฒฝ์„ ์“ฐ๋Š” ๋ณด์ฆ์ด๋ผ๋ฉด CTFE ๊ธฐ๋Šฅ์„ ํ™•์ธํ•  ๋•Œ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๋” ์—„๊ฒฉํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ฌด๋ฆฌ๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ์šฐ๋ฆฌ๋Š” ๋” ๋งŽ์€ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค("const ์•ˆ์ „" ํ™•์ธ). unsafe const ์ปจํ…์ŠคํŠธ์—์„œ const ์ปจํ…์ŠคํŠธ๊ฐ€ ์ถ”๊ฐ€ ๋ณด์žฅ.

์šฐ๋ฆฌ์˜ ์ผ๋ฐ˜์ ์ธ "๋Ÿฐํƒ€์ž„ ์•ˆ์ „"์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์— ์˜ํ•ด ์ „๋ณต๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ "const ์•ˆ์ „"๋„ ์ „๋ณต๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์—ฌ์ „ํžˆ ๊ณต์šฉ์ฒด๋ฅผ ํ†ตํ•ด ptr-to-int ์บ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฌธ์ œ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ์ž…๋‹ˆ๋‹ค. ์ด ์„ธ์ƒ์—์„œ const ์ปจํ…์ŠคํŠธ์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ฆ๋ช… ์˜๋ฌด๋Š” ๋น„ const ์ปจํ…์ŠคํŠธ์˜ ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ด๊ฒƒ์ด ํ•ญ์ƒ PrimVal::Bytes ์ด๊ณ  PrimVal::Ptr ๊ฐ€ ์•„๋‹˜์„ ์ฆ๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@eddyb ์˜ ๋งคํฌ๋กœ์—๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ธ”๋ก์ด ํ•„์š”ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ "const unsafe ๊ธฐ๋Šฅ"(ptr-to-usize ํ›„ ๊ฒฐ๊ณผ ๋นผ๊ธฐ ๋˜๋Š” ํฌ์ธํ„ฐ ๋นผ๊ธฐ ๋‚ด์žฅ ํ•จ์ˆ˜ ์‚ฌ์šฉ)๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์ง์ ‘) CTFE ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ.

์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ์˜ ๋น„์šฉ์€ ์•ˆ์ „ํ•œ ๊ณ ์ฐจ const fn ๊ฐ€ const fn ํด๋กœ์ €๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํด๋กœ์ € ์‹คํ–‰ ์ž์ฒด๊ฐ€ "const ์•ˆ์ „"์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์•ˆ์ „ํ•œ const fn ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ๋ณด์ฆ์„ ์–ป๋Š” ๋Œ€๊ฐ€์ž…๋‹ˆ๋‹ค.

[1] ๋น„๊ฒฐ์ •๋ก ์ด ์–ด๋””์—์„œ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ float๋ฅผ ์™„์ „ํžˆ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. CTFE ์‹œ๊ฐ„๊ณผ ๋Ÿฐํƒ€์ž„์— ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ์ฝ”๋“œ์— ๋Œ€ํ•œ ์˜ˆ๋ฅผ ๋ˆ„๊ตฐ๊ฐ€ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ๋ถ€๋™ ์†Œ์ˆ˜์  ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ํ”ผ์—ฐ์‚ฐ์ž ์ค‘ ํ•˜๋‚˜๊ฐ€ ์‹ ํ˜ธ NaN(์ฒซ ๋ฒˆ์งธ ๋ณด์ฆ์„ ์–ป๊ธฐ ์œ„ํ•ด ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ)์ธ ๊ฒฝ์šฐ miri ์˜ค๋ฅ˜๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  CTFE ์œ ํ˜• ์‹œ์Šคํ…œ์ด f32 / f64 ์œ ํ˜•์—์„œ NaN ์‹ ํ˜ธ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ("const ์•ˆ์ „"์„ ์–ป๊ธฐ ์œ„ํ•ด)?

์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ @eddyb ๊ฐ€ ๋ณดํ˜ธ ์žฅ์น˜๋กœ ์ถ”๊ฐ€ํ•œ ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ assert!(condition); ๋ฅผ [()][!condition as usize]; ๋กœ ๋‹ค์‹œ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. assert!(condition); [()][!์กฐ๊ฑด์„ ์‚ฌ์šฉ]์œผ๋กœ; ์ง€๊ธˆ์€.

๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ์ฃผ์žฅ์ด ์•„๋‹ˆ๋ผ ๊ท€ํ•˜์˜ ์กฐ๊ฑด์—์„œ ํฌ์ธํ„ฐ ํ‰๋“ฑ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ ํ‰๋“ฑ์€ ์•…์ด๋ฉฐ CTFE์—์„œ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ์„ธ์š”. ๋ฐฉ๊ธˆ assert ์ด ์˜คํ”„์…‹์„ ํ…Œ์ŠคํŠธํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ wrapping_sub ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ํฌ์ธํ„ฐ๊ฐ€ ๋™์ผํ•œ ๋ธ”๋ก์— ์žˆ์ง€ ์•Š์œผ๋ฉด miri๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ CTFE ์‹œ๊ฐ„์— ์‹คํŒจํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

// 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๋ฒˆ์งธ ๋น„ํŠธ์˜ ์ง์ˆ˜๋ฅผ ์–ป๋Š” ๊ฒƒ์€ ๊ฒฐ์ •์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์ƒ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ์ •์ ์ด ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ์ •์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„(๊ฒฐ์ •์  ํ™˜๊ฒฝ)์— ๋ฐœ์ƒํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋Ÿฐํƒ€์ž„(๋น„๊ฒฐ์ •์  ํ™˜๊ฒฝ)์— ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

const fn์€ ์‚ฌ์šฉ ์ค‘์ธ ํ™˜๊ฒฝ๋งŒํผ ๊ฒฐ์ •์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@SoniEx2

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

์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋Š” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‘ ํฌ์ธํ„ฐ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ• ๋‹น๋œ ๊ฐœ์ฒด ๋‚ด์— ์žˆ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ํ˜„์žฌ ์—ญ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์›์‹œ ํฌ์ธํ„ฐ ๋น„๊ต ๋ฒ„์ „์œผ๋กœ ์‚ด ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ "์ „์ฒด ๋ฏธ๋ฆฌ"๊ฐ€ ํ˜„์žฌ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜). ๊ทธ๋Ÿฌ๋‚˜ T ์˜ ํฌ๊ธฐ๊ฐ€ 0์ด๋ฉด ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋งŒ ๊ณ ๋ คํ•˜๋”๋ผ๋„ ๊ฐ์ฒด์˜ ๋์„ ์ง€๋‚˜ ํ•˜๋‚˜๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— is_eq ๋Š” "const safe"๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

C++์—์„œ๋Š” ๋์„ ์ง€๋‚˜ ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋ถˆํ™•์‹คํ•œ(๋น„๊ฒฐ์ •์ ) ๊ฒฐ๊ณผ๋ฅผ ์‚ฐ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. C์™€ C++ ๋ชจ๋‘ ๋Œ•๊ธ€๋ง ํฌ์ธํ„ฐ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋ถˆํ™•์‹คํ•œ ๊ฒฐ๊ณผ๋ฅผ ์‚ฐ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LLVM์ด ๋ฌด์—‡์„ ๋ณด์žฅํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์ง€๋งŒ C/C++์— ๋Œ€ํ•ด ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ(๋‘˜ ์ค‘ ๋” ์•ฝํ•œ ๊ฒฝ์šฐ)์„ ์ดˆ๊ณผํ•˜๋Š” ๋ณด์žฅ์— ๋‚ด๊ธฐ๋ฅผ ๊ฑธ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ CTFE์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๋Ÿฐํƒ€์ž„ ๊ฒฐ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@RalfJung

์ฐจ์ด์ ์€ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์„ ์™„๋ฃŒํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

์•…๋งˆ ์˜นํ˜ธ์ž: "๋ฐ˜ํ™˜ โŠฅ" ์€ ํ•œ ๊ฒฝ์šฐ์— ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋†€๋ผ์šด ํ–‰๋™์œผ๋กœ ๋ด…๋‹ˆ๋‹ค. ์„ค๋ช…์„ ํ•ด์ฃผ์‹œ๋ฉด ์ดํ•ด๊ฐ€ ๋˜๊ฒ ์ง€๋งŒ(๋Œ€ํ‘œ๋Š” ์•„๋‹ˆ์ง€๋งŒ...) ์ œ ์ง๊ฐ์—๋Š” ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@oli-obk

๋”ฐ๋ผ์„œ ๋Ÿฐํƒ€์ž„์— ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๋Š” ๋™์ผํ•œ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํ‰๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ˆœ๋„๊ฐ€ ๋ณด์žฅ๋ฉ๋‹ˆ๊นŒ?

๊ฐœ์ธ์ ์œผ๋กœ ์ด ๋ณด์ฆ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ˆœ๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์–ด๋””๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ๋จผ์ € ๋ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋งˆ๋น„๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์„ ๋•Œ๋งŒ ๋” ์•ฝํ•œ ๋ณด์ฆ์œผ๋กœ ๋‚˜์•„๊ฐ€์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@RalfJung

์ด๋Š” ์•ˆ์ „ํ•œ const fn์ด ์„ฑ๊ณต์ ์ธ CTFE ์‹คํ–‰๊ณผ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์— ๊ฒฐ์ •์ ์ž„์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์ข‹์•„์š”; ๋‹น์‹ ์€ ๋‚˜๋ฅผ ์žƒ์—ˆ๋‹ค; ๋‘ ์ „์ œ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์ด "safe const fn is deterministic" ๋ณด์žฅ์— ์–ด๋–ป๊ฒŒ ๋„๋‹ฌํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์‹ ๊ฒฝ์„ ์“ฐ๋Š” ๋ณด์ฆ์ด๋ผ๋ฉด CTFE ๊ธฐ๋Šฅ์„ ํ™•์ธํ•  ๋•Œ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๋” ์—„๊ฒฉํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ฌด๋ฆฌ๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ์šฐ๋ฆฌ๋Š” ๋” ๋งŽ์€ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค("const ์•ˆ์ „" ํ™•์ธ). ๊ทธ๋ ‡๋‹ค๋ฉด const ์ปจํ…์ŠคํŠธ๊ฐ€ ์ถ”๊ฐ€ ๋ณด์žฅ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋ฉด์„œ ptr-to-int ์บ์ŠคํŠธ๋ฅผ const ์ปจํ…์ŠคํŠธ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์ผ๋ฐ˜์ ์ธ "๋Ÿฐํƒ€์ž„ ์•ˆ์ „"์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์— ์˜ํ•ด ์ „๋ณต๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ "const ์•ˆ์ „"๋„ ์ „๋ณต๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์—ฌ์ „ํžˆ ๊ณต์šฉ์ฒด๋ฅผ ํ†ตํ•ด ptr-to-int ์บ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฌธ์ œ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ด ์„ธ์ƒ์—์„œ const ์ปจํ…์ŠคํŠธ์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ฆ๋ช… ์˜๋ฌด๋Š” ๋น„ const ์ปจํ…์ŠคํŠธ์˜ ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ํ•ญ์ƒ PrimVal::Bytes ์ด๊ณ  PrimVal::Ptr ๊ฐ€ ์•„๋‹˜์„ ์ฆ๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‹จ๋ฝ์€ ๋‚ด ๊ท€์— ์Œ์•…์ž…๋‹ˆ๋‹ค! โค๏ธ ์ด๊ฒƒ์€ ๊ฒฐ์ •๋ก ("์ˆœ๋„")์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์ •ํ™•ํžˆ ๋‚ด๊ฐ€ ์ด์ „์— ์—ผ๋‘์— ๋‘์—ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” const ์•ˆ์ „ ๋„ ํ›Œ๋ฅญํ•œ ์šฉ์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

๋‚˜์ค‘์— ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ๋ณด์ฆ์„ "CTFE ๊ฑด์ „์„ฑ"์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. CTFE์— ์˜ค๋ฅ˜๊ฐ€ ์—†์œผ๋ฉด ๋™์ž‘์ด ๋Ÿฐํƒ€์ž„๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋ฐœ์‚ฐํ•˜๊ฑฐ๋‚˜ ๋‘˜ ๋‹ค ๋™์ผํ•œ ๊ฐ’์œผ๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. (์—ฌ๊ธฐ์„œ ๊ณ ์ฐจ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์™„์ „ํžˆ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.)

@์„ผํŠธ๋ฆด

์•…๋งˆ ์˜นํ˜ธ์ž: "๋ฐ˜ํ™˜ โŠฅ"์€ ํ•œ ๊ฒฝ์šฐ์— ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ๊ทธ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ์ •์˜์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์„ค๋ช…ํ•˜๋Š” CTFE ๊ฑด์ „์„ฑ ๋ณด์ฆ์„ ์ดํ•ดํ•˜๊ณ  ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ณด์ฆ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ ๊ฐ€ ์›ํ•˜๋Š” ์ „๋ถ€์ธ์ง€๋Š” ํ† ๋ก ์˜ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค :)

์ข‹์•„์š”; ๋‹น์‹ ์€ ๋‚˜๋ฅผ ์žƒ์—ˆ๋‹ค; ๋‘ ์ „์ œ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์ด "safe const fn is deterministic" ๋ณด์žฅ์— ์–ด๋–ป๊ฒŒ ๋„๋‹ฌํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

foo(x) ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ foo ๋Š” ์•ˆ์ „ํ•œ const ํ•จ์ˆ˜์ด๊ณ  x ๋Š” const-valid ๊ฐ’์ž…๋‹ˆ๋‹ค(์ฆ‰, &y as *const _ as usize ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ). ๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๋Š” foo(x) ๊ฐ€ const ์•ˆ์ „์— ์˜ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  CTFE์—์„œ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ CTFE ๊ฑด์ „์„ฑ์— ์˜ํ•ด ๋Ÿฐํƒ€์ž„์— foo(x) ๋Š” CTFE์—์„œ์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ณธ์งˆ์ ์œผ๋กœ ์ €๋Š” ๊ท€ํ•˜์˜ ๋ณด์ฆ์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋ถ„ํ•ดํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์•ˆ์ „ํ•œ const fn์ด CTFE๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ž‘์—…์„ ์‹œ๋„ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: stdin์—์„œ ์ฝ๊ธฐ ๋˜๋Š” ํฌ์ธํ„ฐ์˜ ์ตœํ•˜์œ„ ๋ฐ”์ดํŠธ๊ฐ€ 0์ธ์ง€ ํ™•์ธ). CTFE ๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋Ÿฐํƒ€์ž„๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋‹จ๋ฝ์€ ๋‚ด ๊ท€์— ์Œ์•…์ž…๋‹ˆ๋‹ค! ๋งˆ์Œ ์ด๊ฒƒ์€ ๊ฒฐ์ •๋ก ("์ˆœ์ˆ˜ํ•จ")์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์ •ํ™•ํžˆ ๋‚ด๊ฐ€ ์ด์ „์— ์—ผ๋‘์— ๋‘์—ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” const ์•ˆ์ „๋„ ํ›Œ๋ฅญํ•œ ์šฉ์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

๋งˆ์Œ์— ๋“œ์‹ ๋‹ค๋‹ˆ ๋‹คํ–‰์ž…๋‹ˆ๋‹ค. :) ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๊ฒƒ์„ ๋งˆ์นจ๋‚ด ์ดํ•ดํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. "์ˆœ์ˆ˜ํ•จ"์€ ๋„ˆ๋ฌด ๋งŽ์€ ๋‹ค๋ฅธ ๊ฒƒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์–ด์„œ, ๊ทธ ์šฉ์–ด๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ ์ข…์ข… ์•ฝ๊ฐ„ ๋ถˆ์•ˆํ•จ์„ ๋Š๋‚๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ์ •๋ก ์€ const ์•ˆ์ „์„ ์œ„ํ•œ ์ถฉ๋ถ„ ์กฐ๊ฑด์ด ์•„๋‹ˆ๋ฉฐ ๊ด€๋ จ ๊ธฐ์ค€์€ CTFE์—์„œ ์‹คํ–‰ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. (deterministc non-const-safe ํ•จ์ˆ˜์˜ ํ•œ ๊ฐ€์ง€ ์˜ˆ๋Š” orcale ์— 0์„ ๊ณฑํ•œ ๋‚ด ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ์˜ ๋ฐ”์ดํŠธ๋ฅผ ๊ฒ€์‚ฌํ•  ๋•Œ ๋ฏธ๋ฆฌ๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ”์ดํŠธ๊ฐ€ ๊ถ๊ทน์ ์œผ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š๋”๋ผ๋„ ํฌ์ธํ„ฐ์˜ ์ตœํ•˜์œ„ ๋ฐ”์ดํŠธ๋ฅผ ์ถ”์ถœํ•˜๋Š” ์ž‘์—…์ด "const-UB"์ด๋ฏ€๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ const ์ฝ”๋“œ์—์„œ๋„ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.)

์˜ˆ, ๋ฐฐ์—ด ์š”์†Œ์˜ ๋์„ ์ง€๋‚˜๋Š” ํฌ์ธํ„ฐ๋Š” ์•„๋งˆ๋„ ๋‹ค์Œ ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ญ? ์ •๋ง ๋น„๊ฒฐ์ •์  ์•„๋‹Œ๊ฐ€์š”? ์–ด์จŒ๋“  ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •์ ์ธ ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฑฑ์ •ํ•˜๋Š” ํ•œ ๋Ÿฐํƒ€์ž„ ํ‰๊ฐ€๋Š” ์Šคํƒ ๊ณ ๊ฐˆ๋กœ ์ธํ•ด segfault๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@RalfJung

๊ทธ๋Ÿฌํ•œ ์‹œ์Šคํ…œ์˜ ๋น„์šฉ์€ ์•ˆ์ „ํ•œ ๊ณ ์ฐจ const fn ๊ฐ€ ํด๋กœ์ € ์‹คํ–‰ ์ž์ฒด๊ฐ€ "const ์•ˆ์ „"์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก const fn ํด๋กœ์ €๋ฅผ ์ทจํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์•ˆ์ „ํ•œ const fn ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ๋ณด์ฆ์„ ์–ป๋Š” ๋Œ€๊ฐ€์ž…๋‹ˆ๋‹ค.

?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!
}

์ผ์ฃผ์ผ ์ •๋„ ํ›„์— ์ด ํšจ๊ณผ(๋ฐ ๊ทธ ์ด์ƒ)์— ๋Œ€ํ•ด ์ œ์•ˆํ•˜๋Š” RFC๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Centril ์€ ์ด ์‹œ์ ์—์„œ ํšจ๊ณผ ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํšจ๊ณผ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ํ•ญ์ƒ ๋‹น์‹ ์˜ ๋น„๋ฐ€(?) ์˜์ œ์˜€๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@RalfJung ์ž‘๋…„์— https://github.com/rust-lang/rfcs/pull/2237์—์„œ ์ด๋ฏธ ๋น„๋ฐ€์„ ๊ณต๊ฐœํ–ˆ์ง€๋งŒ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ;)
์ด์ œ ๊ฑฐ์˜ ๊ณต๊ฐœ ๋„๋ฉ”์ธ ^,-

@SoniEx2

์˜ˆ, ๋ฐฐ์—ด ์š”์†Œ์˜ ๋์„ ์ง€๋‚˜๋Š” ํฌ์ธํ„ฐ๋Š” ์•„๋งˆ๋„ ๋‹ค์Œ ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ญ? ์ •๋ง ๋น„๊ฒฐ์ •์  ์•„๋‹Œ๊ฐ€์š”? ์–ด์จŒ๋“  ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •์ ์ธ ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฑฑ์ •ํ•˜๋Š” ํ•œ ๋Ÿฐํƒ€์ž„ ํ‰๊ฐ€๋Š” ์Šคํƒ ๊ณ ๊ฐˆ๋กœ ์ธํ•ด segfault๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(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 ์— ๋Œ€ํ•œ ๋น„๊ต๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ํ•˜๋‚˜์˜ ํฌ์ธํ„ฐ๋Š” x ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” y ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ ๋‘ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ™์„ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
๋ฌผ๋ก , ํ•˜๋‚˜์˜ ํฌ์ธํ„ฐ๊ฐ€ x ์˜ ๋์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  $#$5 y #$ ์™€ ๊ฐ™์€ ์ฃผ์†Œ์ธ ๋จธ์‹ ์—์„œ ์ฃผ์†Œ ๊ฐ€ ๋™์ผํ•˜๋‹ค๋Š” ์ ์€ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค! ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฃผ์†Œ์˜ ์ถœ์ฒ˜๋ฅผ ๋” ์ด์ƒ ๋ณผ ์ˆ˜ ์—†๋„๋ก ์ฝ”๋“œ๋ฅผ ์ถฉ๋ถ„ํžˆ ๊ฐ€๋ฆฌ๋ฉด ๋น„๊ต๊ฐ€ true ๋กœ ํ‰๊ฐ€๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ C++ ํ‘œ์ค€์€ ์ตœ์ ํ™”( false ๋ผ๊ณ  ํ•จ)์™€ ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ปดํŒŒ์ผ( true ๋ผ๊ณ  ํ•จ)์„ ๋ชจ๋‘ ์ •๋‹นํ™”ํ•˜์—ฌ ๋‘ ๊ฒฐ๊ณผ๊ฐ€ ๋ชจ๋‘ ๋น„๊ฒฐ์ •์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. C ํ‘œ์ค€์€ ์ด๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ LLVM(๋ฐ GCC) ๋น„์ค€์ˆ˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‘˜ ๋‹ค ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ์Šค๋ ˆ๋“œ ๋ฐ/๋˜๋Š” IRC์— ๋Œ€ํ•œ ๊ด€๋ จ ํ† ๋ก ์—์„œ ๋‚˜์˜จ const ์•ˆ์ „, const ๊ฑด์ „์„ฑ ๋“ฑ์— ๋Œ€ํ•œ ๋‚ด ์•„์ด๋””์–ด์˜ ์š”์•ฝ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. https://www.ralfj.de/blog/2018/07/19/ const.html

์—ฌ๊ธฐ์—์„œ ์ด ๋ฌธ์ œ๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ๋“ค์ด ๋…ผ์˜๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ’€๊ธฐ ๋‹ค์†Œ ์–ด๋ ค์›Œ์กŒ์Šต๋‹ˆ๋‹ค. @oli-obk๋Š” const-eval ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŠน์ • ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ๋…ผ์˜ํ•˜๊ธฐ์— ์ข‹์€ ์žฅ์†Œ๋Š” ์•„๋งˆ๋„ https://github.com/rust-rfcs/const-eval์˜ ๋ฌธ์ œ ์ถ”์ ๊ธฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Centril ์€ ํ–ฅํ›„ ํ™•์žฅ๊ณผ ํ˜ธํ™˜๋˜๋Š” ์ตœ์†Œ ๋ฒ„์ „์„ ์•ˆ์ •ํ™”ํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ํŠน์„ฑ ๊ฒฝ๊ณ„๊ฐ€ ์žˆ๋Š” ์ผ๋ฐ˜ ์ธ์ˆ˜ ์—†์Œ
  • fn ํฌ์ธํ„ฐ ๋˜๋Š” dyn Trait ์œ ํ˜•์˜ ์ธ์ˆ˜ ๋˜๋Š” ๋ฐ˜ํ™˜ ์œ ํ˜• ์—†์Œ

    • ์ธ์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•ด ์žฌ๊ท€์ ์œผ๋กœ ๊ฒ€์‚ฌํ•˜๋ฏ€๋กœ ์ธ์ˆ˜ ํ•„๋“œ๋„ ์ด๋Ÿฌํ•œ ์œ ํ˜•์ด ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ์—†์Œ(๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—)

    • ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ด๋ฏธ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ ๋’ค์— ์žˆ๋Š” union ์™€ ์›์‹œ ํฌ์ธํ„ฐ derefs(์ผ๋ฐ˜์ ์œผ๋กœ ํ˜„์žฌ ์ƒ์ˆ˜์—์„œ ๊ธˆ์ง€๋จ)๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” ๋‹ค๋ฅธ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ const fns ๋˜๋Š” const ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ์ž์ฒด ํ† ๋ก  wrt ์•ˆ์ •ํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

(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 = ... ์—์„œ unsafe ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. const fn ๋ฐ”๋””๋Š” const ๋ฐ”๋””์™€ ๋™์ผํ•˜๊ฒŒ ํ™•์ธ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ "unconst" ์ž‘์—…์— ๋Œ€ํ•ด ๋ณด์ˆ˜์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์•ˆ์ „ํ•˜์ง€๋งŒ const-safeํ•˜์ง€ ์•Š์€ ์ž‘์—…(๊ธฐ๋ณธ์ ์œผ๋กœ ์›์‹œ ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ)์ด์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ์ด๋ฏธ const ์ปจํ…์ŠคํŠธ์—์„œ ์™„์ „ํžˆ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ?

๊ฒฝ๊ณ„๋Š” const fn ์ž์ฒด์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ํ•ด๋‹น ์ œ์•ˆ์—์„œ๋Š” impl ๋ธ”๋ก์˜ ๊ฒฝ๊ณ„๋„ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์˜ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚ด ์˜๊ฒฌ์— ์–ธ๊ธ‰ ๋œ๋Œ€๋กœ ๋ฌธ์ œ๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  const ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ/๊ธฐ๋Šฅ์€ ์–ด์จŒ๋“  ์ž์ฒด ์•ˆ์ •ํ™”๋ฅผ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@RalfJung ๋‚ด ์ƒ๊ฐ์— ๋ฌธ์ œ๋Š” " @Centril ์€ ์šฐ๋ฆฌ๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์นœ ๊ฒƒ์— ๋Œ€ํ•ด ๊ธด์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์ด๋ฏธ const ์ปจํ…์ŠคํŠธ์—์„œ ์™„์ „ํžˆ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"์ž…๋‹ˆ๋‹ค. ;) ํ•˜์ง€๋งŒ ์–ด๋–ค ์‹œ์ ์—์„œ unsafe { .. } in const fn ๋ฅผ ์•ˆ์ •ํ™”ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ์—†๊ณ  ๋ชจ๋“  unconst ์ž‘์—…์„ ํฌ์ฐฉํ–ˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜๋ฉด ์‹คํ–‰ํ•ด ๋ณผ๊นŒ์š”?

๊ฒŒ๋‹ค๊ฐ€, ์šฐ๋ฆฌ๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์ณค๋‹ค๋ฉด, ์‚ฌ๋žŒ๋“ค์ด const ์—์„œ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ const fn RFC repo ์˜ const ์•ˆ์ „/์Šน์ง„ ๋ถ€๋ถ„์„ ์ฑ„์šฐ๋Š” PR์„ ์ž‘์„ฑํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ฃจ์—ˆ๋Š”์ง€(๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์žˆ๋Š”์ง€) ์ฃผ์˜ ๊นŠ๊ฒŒ ํ™•์ธํ•ด์•ผ ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค.

Discord์— ๋‚˜์˜จ ๋˜ ๋‹ค๋ฅธ ์‚ฌํ•ญ์€ 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 ๋กœ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ์ง€๊ธˆ ์•ˆ์ •ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ์ œํ•œ์ ์ด๋ฉฐ ๊ฝค ๊ดœ์ฐฎ์€ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋‹จํŽธ์ ์ธ ์•ˆ์ •ํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ
์ œํ•œ ์‚ฌํ•ญ๊ณผ ๊ทธ ์ •๋‹น์„ฑ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๋ชฉ๋ก์„ ์š”์ฒญํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์˜
์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ‰๋ณด๊ธฐ์— ๋ฌดํ•ดํ•œ ๋ณ€๊ฒฝ์„ ํ•˜๊ณ 
์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ตœ์†Œํ•œ ์˜ค๋ฅ˜๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜
์ถ”๋ก ์ด ๋งŽ์€ ํ† ๋ก ์— ๊ฑธ์ณ ํผ์ ธ ์žˆ์Œ์„ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋”ฐ๋ผํ–ˆ์ง€๋งŒ ๋ฌธ์„œ์— ํ…Œ์ด๋ธ”์ด ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (๋˜๋Š”
์ฐธ์กฐ ๋˜๋Š” nomicon, ์ตœ์†Œํ•œ) ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ ์ž‘์—…์„ ๋‚˜์—ดํ•˜๊ณ ,
๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ ๋ฐ ์•ˆ์ •ํ™” ๊ฐ€๋Šฅ์„ฑ(์˜ˆ: "์ ˆ๋Œ€",
"RFC XYZ๊ฐ€ ๊ตฌํ˜„๋œ ๊ฒฝ์šฐ", "์‚ฌ์–‘์˜ ์ด ๋ถ€๋ถ„์„ ํ™•์ •ํ•œ ํ›„").

2018๋…„ 8์›” 20์ผ ์›”์š”์ผ ์˜คํ›„ 1:44 Eduard-Mihai Burtescu <
[email protected]>์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

ํ‚ค์›Œ๋“œ ํ˜•์‹์„ const fn์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด
์ง€๊ธˆ ์€ ์ถฉ๋ถ„ํžˆ ์ œํ•œ์ ์ด๋ฉฐ ๊ฝค ๊ดœ์ฐฎ์€ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค(์–ด๋–ป๊ฒŒ
๋‚ด๊ฐ€ ์ „์— ๋ณธ ์ ์ด ์—†์–ด?!)

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/24111#issuecomment-414403036 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAC3n80yVxIa3agsJP4wXZFkgyHVmAsjks5uSvWXgaJpZM4D66IA
.

@est31 @rkruppe ๊ฐ€ ์ด๋ฏธ ์ผ๋“ฏ์ด ์ด๋Ÿฌํ•œ ํ“จ์ฆˆ๋Š” -ffast-math ์—†์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๋ฒ•์ด๋ฉฐ LLVM์ด ์ด๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ๊ธฐ๋ณธ ์‚ฐ์ˆ ์€ ๊ทธ๋‹ค์ง€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ(x87... ๋•Œ๋ฌธ์— 32๋น„ํŠธ x86 ์ œ์™ธ) ์ดˆ์›” ํ•จ์ˆ˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋“ค์€ const fn ๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ? ๊ทธ๋ž˜์„œ ์ œ ํฌ๋ง์€ ๊ฒฐ๊ตญ const ํ•ญ๋ชฉ, ํŒ์ด‰ ๋ฐ const fn ์‚ฌ์ด์—์„œ๋„ ๋™๋“ฑํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@RalfJung ์˜ˆ๋ฅผ ๋“ค์–ด ์œ ์ถœ ๋ฐ ์ผ๋ถ€ ์ž‘์—… ์‚ฌ์ด์— FPU ๋ ˆ์ง€์Šคํ„ฐ๋กœ ๋‹ค์‹œ ๋กœ๋“œํ•˜๋ฉด ์œ ์ถœ ์—†์ด ๋™์ผํ•œ ๊ณ„์‚ฐ๊ณผ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ๊ธฐ๋ณธ ์‚ฐ์ˆ ์€ ๊ทธ๋‹ค์ง€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ(x87... ๋•Œ๋ฌธ์— 32๋น„ํŠธ x86 ์ œ์™ธ) ์ดˆ์›” ํ•จ์ˆ˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ดˆ์›” ํ•จ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ๋ฌธ์ œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

IIRC์—์„œ ์ผ๋ถ€ ์ดˆ์›” ๊ธฐ๋Šฅ์€ ์ผ๋ฐ˜ x86 ํ”„๋กœ์„ธ์„œ์—์„œ ์ง€์›๋˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ๋Š๋ฆฌ๊ณ  ํ”ผํ•˜๋ฉฐ ๊ธฐ์กด ๊ตฌํ˜„๊ณผ์˜ ์™„์ „์„ฑ๊ณผ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด์„œ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฑฐ์˜ ๋ชจ๋“  ๊ณณ์—์„œ ์ดˆ์›” ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ ์‚ฐ์ˆ  ํ•จ์ˆ˜์˜ ์กฐํ•ฉ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฐ์ˆ  ํ•จ์ˆ˜์˜ ์ฐธ์กฐ ํˆฌ๋ช…๋„์— ์ฐจ์ด๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ด "์•ˆ์ „"ํ•˜๋‹ค๋ฉด ์ดˆ์›” ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์—ฌ ๊ทธ ์œ„์— ๊ตฌ์ถ•๋œ ๋ชจ๋“  ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ "์ฐธ์กฐ ๋ถˆํˆฌ๋ช…์„ฑ"์˜ ์œ ์ผํ•œ ์ถœ์ฒ˜๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋ณธ ์‚ฐ์ˆ  ํ•จ์ˆ˜์˜ ๊ด€์ ์—์„œ ์ด๋Ÿฌํ•œ ์ดˆ์›” ํ•จ์ˆ˜์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ทผ์‚ฌ(๊ตฌํ˜„)์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ์˜ ๊ทผ์›์ธ๊ฐ€?

@est31 ๋Œ€๋ถ€๋ถ„์˜ ์ดˆ์›” ํ•จ์ˆ˜๋Š” ๊ถ๊ทน์ ์œผ๋กœ ์›์‹œ ์ •์ˆ˜์™€ ๋ถ€๋™ ์†Œ์ˆ˜์  ์—ฐ์‚ฐ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์ผ ๋ฟ์ด์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๊ตฌํ˜„์€ ํ‘œ์ค€ํ™”๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์‹ค์ œ๋กœ Rust ํ”„๋กœ๊ทธ๋žจ์€ ์ˆ˜๋ช… ๋™์•ˆ ์„ธ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ตฌํ˜„๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ํ˜ธ์ŠคํŠธ ๋˜๋Š” ๋Œ€์ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ”Œ๋žซํผ:

  • ํ”„๋กœ๊ทธ๋žจ์ด ๋Œ€์ƒ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋Œ€์ƒ ํ”Œ๋žซํผ libm ๋˜๋Š” ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํ•˜๋“œ์›จ์–ด ๋ช…๋ น).
  • LLVM์ด ์‚ฌ์šฉํ•˜๋Š” ์ผ์ •ํ•œ ํด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ ํ˜ธ์ŠคํŠธ ํ”Œ๋žซํผ C libm์ผ ๋ฟ์ž…๋‹ˆ๋‹ค).
  • MIRI๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…์œผ๋กœ ๋ฌด์—‡์ด๋“  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: rustc_apfloat ๋˜๋Š” https://github.com/japaric/libm/๊ณผ ๊ฐ™์€ Rust ๊ตฌํ˜„ ํ•ด์„).

์ด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์„œ๋กœ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ํ‘œํ˜„์‹์ด ํ‰๊ฐ€๋˜๋Š” ์‹œ์ ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@rfcbot ์ทจ์†Œ

์šฐ๋ฆฌ๋Š” ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ์ „์ฒด monty๋ฅผ ์•ˆ์ •ํ™”ํ•  ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋Œ€์‹ , ๊ฐ€๊นŒ์šด ์‹œ์ผ ๋‚ด์— ์•ˆ์ •ํ™”๋  ์ˆ˜ ์žˆ๋Š” ๋ณด๋‹ค ์ตœ์†Œํ•œ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ(https://github.com/rust-lang/rust/issues/24111#issuecomment-414310119์— ๋Œ€๋žต์ ์œผ๋กœ ์„ค๋ช…๋จ)์— ๋Œ€ํ•œ ํ•ฉ์˜๋ฅผ ๋ฐœ์ „์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. .
์ด ํ•˜์œ„ ์ง‘ํ•ฉ์€ #53555์—์„œ ์ถ”์ ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์„ค๋ช…์€ ๊ฑฐ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Centril ์ œ์•ˆ์ด ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@rkruppe ์ดˆ์›” ํ•จ์ˆ˜๋ฅผ llvm ๋‚ด์žฅ ํ•จ์ˆ˜๋กœ ๋‚ฎ์ถ”๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ์ œ์–ดํ•˜๊ณ  ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•˜๊ฒŒ ์ž˜ ์•Œ๋ ค์ง„ ๋…น ์ „์šฉ ๊ตฌํ˜„์œผ๋กœ ๋‚ฎ์ถ”์–ด ์ „์ฒด ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๊นŒ?

์ดˆ์›” ํ•จ์ˆ˜๋ฅผ llvm ๋‚ด์žฅ ํ•จ์ˆ˜๋กœ ๋‚ฎ์ถ”๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ „์ฒด ํฌ๋กœ์Šค ํ”Œ๋žซํผ libm์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๋‹จ์ˆœ์„ฑ ์™ธ์—๋„ ๋‚ด์žฅ ํ•จ์ˆ˜๋Š” LLVM์˜ ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ๊ณผ ์ฝ”๋“œ ์ƒ์„ฑ์—์„œ ์ผ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๊ฐ€ ์–ป์„ ์ˆ˜ ์—†๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์ผ์ •ํ•œ ์ ‘๊ธฐ(& ๊ฐ’ ๋ฒ”์œ„ ๋ถ„์„๊ณผ ๊ฐ™์€ ๊ด€๋ จ ํ•ญ๋ชฉ)๋Š” ์ด ์ปจํ…์ŠคํŠธ์—์„œ ๋ฌธ์ œ์ด์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ˆ˜์  ID๋„ ์žˆ์Šต๋‹ˆ๋‹ค(SimplifyLibCalls ํŒจ์Šค์— ์˜ํ•ด ์ ์šฉ๋จ). ๋งˆ์ง€๋ง‰์œผ๋กœ, ๋ช‡ ๊ฐ€์ง€ ํ•จ์ˆ˜(๋Œ€๋ถ€๋ถ„ sqrt์™€ ๊ทธ ์ƒํ˜ธ, ์ดˆ์›”์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ๋ฌด์—‡์ด๋“  ๊ฐ„์—)์—๋Š” SSE๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ x86์—์„œ sqrtss ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŠน์ˆ˜ ์ฝ”๋“œ ์ƒ์„ฑ ์ง€์›์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ œ์–ดํ•˜๊ณ  ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•˜๊ฒŒ ์ž˜ ์•Œ๋ ค์ง„ ๋…น ์ „์šฉ ๊ตฌํ˜„์œผ๋กœ ๋‚ฎ์ถ”์–ด ์ „์ฒด ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๊นŒ?

์œ„์˜ ๋ชจ๋“  ์‚ฌํ•ญ์„ ๋ฌด์‹œํ•˜๋”๋ผ๋„ IMO๋Š” ์ข‹์€ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€์ƒ ํ”Œ๋žซํผ์— C libm์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋” ์ตœ์ ํ™”๋˜์—ˆ๊ฑฐ๋‚˜ ํŒฝ์ฐฝ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด์žฅ ํ•จ์ˆ˜๋Š” LLVM์˜ ์˜ตํ‹ฐ๋งˆ์ด์ €์™€ ์ฝ”๋“œ์  ์—์„œ ์ผ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๊ฐ€ ์–ป์„ ์ˆ˜ ์—†๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋น ๋ฅธ ์ˆ˜ํ•™์ด ์ผœ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด๋Ÿฌํ•œ ์ตœ์ ํ™”๊ฐ€ ํ™œ์„ฑํ™”๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์ƒ ํ”Œ๋žซํผ์— C libm์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋” ์ตœ์ ํ™”๋˜์—ˆ๊ฑฐ๋‚˜ ํŒฝ์ฐฝ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ™•์‹ ํ•˜๋Š”. ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋˜๋Š” ๋” ์ž‘์€ ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ์†๋„ ํ–ฅ์ƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์œ„ํ•ด ์ด ๋‹ค์†Œ ํ•™๋ฌธ์ ์ธ ์†์„ฑ(์ฐธ์กฐ ํˆฌ๋ช…์„ฑ)์„ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜ ์ด ํ•ญ์ƒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 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 ๋กœ ์ž˜๋ชป ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ๋ ค์ฃผ๋Š” ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๊ฐ€ &mut ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋น„ const ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ปดํŒŒ์ผ์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ const fn ์˜ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์ด๋Ÿฌํ•œ ์ œํ•œ์„ ์–ด๊ธฐ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ (a) ๋ณ„๋„์˜ ๊ธฐ๋Šฅ์—์„œ const ๊ฐ€ ์•„๋‹Œ ๋น„ํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์˜๋„๋œ ๋ณ€๊ฒฝ์ธ ๊ฒฝ์šฐ API๋ฅผ ์ค‘๋‹จํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋…ผ์˜ํ•œ ์ ์ด ์—†๋Š” ๋˜ ๋‹ค๋ฅธ ์ค‘๊ฐ„ ์ง€์ ์ด ์žˆ์œผ๋ฉฐ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด ๋งˆ์ปค์˜ ๋ฐ˜๋Œ€์™€ ์ผ์ข…์˜ "ํ•จ์ˆ˜ ์ˆœ๋„ ์ถ”๋ก "์„ ๋„์ž…ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฌธ์„œ๋Š” ์‹ค์ œ ๋งˆ์ปค๋ฅผ ํ‘œ์‹œํ•˜์ง€๋งŒ const ์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ๋งˆ์ปค์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ผ์ข…์˜ ๊ฒฝ๊ณ ์™€ ํ•จ๊ป˜ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด ๊ฒŒ์œผ๋ฆ„์„ ๋ถ€์ถ”๊ธฐ๊ณ  ๊ฑฐ์˜ ๋งค๋ฒˆ ์ด๊ฒƒ์„ ํ•˜๋„๋ก ๋ถ€์ถ”๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋Š” ๋ชฉ์ ์ด ์•„๋‹™๋‹ˆ๋‹ค.

const fn์ด ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? &mut ๊ฐ€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@aledomu ๋‚ด ์˜๊ฒฌ์€ @AGaussman์—๊ฒŒ ์ „๋‹ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๊ฐ€ "์˜๋„๋œ" const๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 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);

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋Œ€์ƒ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋Œ€์ƒ ๋ฌธ์ œ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฌธ์ œ์— ์˜ํ•ด ์•„์ง ์ถ”์ ๋˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ์˜์—ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ทธ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๋…ผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. const eval ๋ฐ 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 ๋Š” ๋ชจ๋‘ private ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ƒ์„ฑ์ž์ž…๋‹ˆ๋‹ค. Clone ๊ฐ€ ์ƒ์„ฑ์ž์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋”๋ผ๋„ ์ „์ž ๋ฉ”์‹œ์ง€๋Š” struct Guard<T: Clone + Copy> ์˜ ์ƒ์„ฑ์ž์— ์žˆ์Šต๋‹ˆ๋‹ค. ํ›„์ž๋Š” Option<fn()> (๋‹จ์ˆœํ™”)๋ฅผ None ๋˜๋Š” Some(name_of_a_function_item) ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ์ด ํ˜ธ์˜ ์„ค๋ช…์—๋Š” ํŠน์„ฑ์ด๋‚˜ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์œ ํ˜•์ด ๋ชจ๋‘ ์–ธ๊ธ‰๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋‘ ๊ฐ€์ง€ ํŠน์ • ๋ฌธ์ œ๊ฐ€ ๋” ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด ๋ง์€ const_fn ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ ๋’ค์— ์žˆ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ(์—ฌ๊ธฐ์—์„œ ์—ฌ์ „ํžˆ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋จ)์— ์ถ”์  ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ๋“  ํ™•์ธํ•  ๋•Œ๊นŒ์ง€ ์ด ํ•ญ๋ชฉ์„ ๋‹ค์‹œ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” const_fn ์ด ์™„์ „ํžˆ ์•ˆ์ •ํ™”๋  ๋•Œ๊นŒ์ง€.

@SimonSapin

๋ฉ”ํƒ€ ์ถ”์  ๋ฌธ์ œ๊ฐ€ ๋‹ค๋ฃจ๋Š” ๋‚ด์šฉ์ด ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ œ์— ์˜ํ•ด ์ฒ ์ €ํ•˜๊ฒŒ ๋‹ค๋ฃจ์–ด์ง€๋Š”์ง€ ์ „ํ˜€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์„ ๋•Œ ๋ฉ”ํƒ€ ์ถ”์  ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์€ ์ ์ ˆํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” https://github.com/rust-lang/rust/issues/34511 ์˜ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ถ”์  ๋ฌธ์ œ๊ฐ€ ์ง„ํ–‰๋˜๋Š” ํ•œ ๊ฐ€์žฅ ํฐ ํ˜ผ๋ž€ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๋˜ํ•œ ํ•œ๋™์•ˆ ๋ชจ๋‘์—๊ฒŒ ๋ฌด๋ฃŒ์˜€์œผ๋ฏ€๋กœ ์ง€๊ธˆ์€ ๋ฉ”ํƒ€ ๋ฌธ์ œ๋กœ ์ž‘์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ฒƒ์„ ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋Œ€์‹  http://internals.rust-lang.org/ ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ํ˜ธ์˜ ์„ค๋ช…์—๋Š” ํŠน์„ฑ์ด๋‚˜ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์œ ํ˜•์ด ๋ชจ๋‘ ์–ธ๊ธ‰๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋‘ ๊ฐ€์ง€ ํŠน์ • ๋ฌธ์ œ๊ฐ€ ๋” ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ๋‚ด๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. T-Lang ๋ถ„๋ฅ˜ ๊ด€์ ์—์„œ ๋ชฉํ‘œ๊ฐ€ ์žˆ๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚ด ๋ง์€ const_fn ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ ๋’ค์— ์žˆ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ(์—ฌ๊ธฐ์—์„œ ์—ฌ์ „ํžˆ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋จ)์— ์ถ”์  ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ๋“  ํ™•์ธํ•  ๋•Œ๊นŒ์ง€ ์ด ํ•ญ๋ชฉ์„ ๋‹ค์‹œ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” const_fn ์ด ์™„์ „ํžˆ ์•ˆ์ •ํ™”๋  ๋•Œ๊นŒ์ง€.

const_fn ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๊ฐ€ ๋ฌด์—‡์„ ๊ตฌ์„ฑํ•˜๋Š”์ง€ ๋˜๋Š” ์–ด๋Š ์‹œ์ ์—์„œ ๋ชจ๋‘ ์•ˆ์ •ํ™”๋  ๊ฒƒ์ธ์ง€์กฐ์ฐจ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›๋ž˜ RFC์˜ ๋ฒ”์œ„์™€ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฒƒ์—๋Š” ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ์ผ๋ถ€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

const_fn ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๊ฐ€ ๋ฌด์—‡์„ ๊ตฌ์„ฑํ•˜๋Š”์ง€์กฐ์ฐจ ๋‚˜์—๊ฒŒ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์•Œ์•„๋‚ผ ๋•Œ๊นŒ์ง€ ๋‹ซ์ง€ ๋ง์•„์•ผ ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค, IMO.

๋ชจ๋“  ๊ฒƒ

๊ทธ๋ž˜๋„ ๊ทธ๊ฒŒ ์ •๋ง ์ „๋ถ€์ผ๊นŒ์š”?

const_string_new ๊ธฐ๋Šฅ์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ถ”์  ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ถˆ์•ˆ์ •ํ•œ ์ฑ… ์€ ์—ฌ๊ธฐ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

@phansch ๋ชจ๋“  rustc_const_unstable ๊ฐ€ ์—ฌ๊ธฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. (cc @oli-obk ์šฐ๋ฆฌ๊ฐ€ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?)

๋ฌธ์ œ๋Š” ๊ทธ๋•Œ ์—ด๋ ค ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ ๋ฐ›๋Š”๊ฑด ์œ ์ €๋กœ์„œ ๋ชจ์š•์ผ๋ฟ
๋‹ซํžŒ ๋ฌธ์ œ์—.

2019๋…„ 1์›” 9์ผ ์ˆ˜์š”์ผ 04:05 Mazdak Farrokhzad < [email protected]
์ผ๋‹ค:

@phansch https://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 : ์•ผ๊ฐ„์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋‹ซํ˜€ ์žˆ๊ณ  ํ•ด์ƒ๋„๊ฐ€ ์—ฌ์ „ํžˆ ์•ˆ์ •์ ์ธ ์ƒํƒœ์— ๋„๋‹ฌํ•˜์ง€ ์•Š์€ ๊ฐ€๋Šฅํ•œ ์ฐฝ์ด ํ•ญ์ƒ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์–ด๋–ป๊ฒŒ ๋ชจ์š•์ ์ด์•ผ?

๋‚˜๋Š” ์—ฌ๊ธฐ์—์„œ ๋…ผํ‰ํ•˜๋Š” ๊ฒƒ์„ ๊ฑฐ๋ถ€ํ–ˆ๊ณ  ์•„๋งˆ๋„ ์ด ๋Œ€ํ™”๋ฅผ ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด๋ฏธ ํ•˜๋‚˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?) ํ•˜์ง€๋งŒ...

ํ์‡„ ๊ฒฐ์ •์€ ๋‚˜์—๊ฒŒ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์— ํ‘œ์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์  ๋ฌธ์ œ์ด๋ฉฐ ํ˜ผ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋” ๋งŽ์€ ์˜ˆ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. https://internals.rust-lang.org/t/psa-tracking-for-gated -์–ธ์–ด ๊ธฐ๋Šฅ/2887. ๋‚˜์—๊ฒŒ ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ๋Š” ๊ฒƒ์€ ์•ˆ์ •์„ฑ์„ ์˜๋ฏธํ•˜์ง€๋งŒ ์•„์ง๊นŒ์ง€๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด์„œ ์ด๊ฒƒ์„ ๋‹ซ๋Š” ๋ฐ ๋Œ€ํ•œ ๋…ผ์Ÿ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ... ๋” ๋ชฉํ‘œ๊ฐ€ ๋œ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜์—ฌ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํฌ๋ง์ ์œผ๋กœ ์ƒˆ๋กœ์šด ํ† ๋ก ๊ณผ ์ดˆ์ ์„ ๊ฐ€์ง€๊ณ  ๊ตฌํ˜„์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ช…ํ™•ํ•œ ๋ฐฉ๋ฒ•์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค๊ณผ์˜ ๋ฉ”์‹œ์ง€.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ๋‚ด๋ถ€์— ์Šค๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ๋Œ€ํ™”๋ฅผ ๊ฑฐ๊ธฐ๋กœ ์ด๋™ํ• ๊นŒ์š”?

ํŽธ์ง‘: ์•„๋‹ˆ๋ฉด ์ฑ…์ด ๊ตฌ์‹์ด๋ผ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? RFC์˜ ์˜ˆ์ œ( #[derive(...)] ๋ช‡ ๊ฐœ ๋ˆ„๋ฝ)๋ฅผ ์‹œ๋„ํ•˜๋ฉด Rust rustc 1.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 ๋“ฑ๊ธ‰