Caso de prueba: bounds vacíos

Una consecuencia de cómo funcionan los bounds es que incluso si un trait no incluye ninguna funcionalidad, aún puede usarlo como un bound. Eq y Copy son ejemplos de tales traits de la biblioteca std.

struct Cardenal;
struct CharaAzul;
struct Pavo;

trait Rojo {}
trait Azul {}

impl Rojo for Cardenal {}
impl Azul for CharaAzul {}

// Estas funciones solo son válidas para tipos que implementan estos rasgos.
// El hecho de que los rasgos estén vacíos es irrelevante.
fn rojo<T: Rojo>(_: &T) -> &'static str { "rojo" }
fn azul<T: Azul>(_: &T) -> &'static str { "azul" }

fn main() {
    let cardenal = Cardenal;
    let chara_azul = CharaAzul;
    let _pavo   = Pavo;

    // `rojo()` no funcionará en una chara azul ni viceversa debido a los vínculos.
    println!("Un cardenal es {}", rojo(&cardenal));
    println!("Una chara azul es {}", azul(&chara_azul));
    //println!("Un pavo es {}", rojo(&_pavo));
    // ^ TODO: Intenta descomentar esta línea.
}

Ve también

std::cmp::Eq, std::marker::Copy