gpt4 book ai didi

c++ - `enable_if` 使编译器难以生成可读的错误消息呢?

转载 作者:太空狗 更新时间:2023-10-29 20:53:40 27 4
gpt4 key购买 nike

enable_if 的“批评者”之一是它会产生一团糟的错误消息。所以例如Bjarne Stroustrup 希望引入概念来解决这个问题(参见 his talk (youtube)the example (wikipedia))。

我的问题:是什么让编译器在使用 enable_if 生成可读输出时在技术上如此具有挑战性?

最佳答案

std::enable_if听起来像是可以在给定编译时 bool 表达式的情况下启用/禁用函数模板类模板 的特殊功能……但事实并非如此。这是一个可能的实现:

template <bool TCond, typename T = void> 
struct enable_if {};

template <typename T>
struct enable_if<true, T> { using type = T; };

上面的意思是:

  • 如果 TCondtrue , enable_if将定义一个内部 type类型别名。

  • 如果 TCondfalse , enable_if定义内部 type类型别名。

enable_if被用来启用/禁用某些东西,我们引用它的::type内部别名:

template <typename T, 
typename = std::enable_if</* something */>::type>
void foo(T) { /* something */ }

如果::type存在以上 /* something */条件,foo是良构的。否则,发生替代失败,触发SFINAE .

编译器不知道我们的意图并通过跟踪错误源来处理最终的错误。它不知道我们打算启用/禁用一组函数/类中的某些函数/类——因此它不能给我们有意义和直观的错误。它能做的最好的事情就是查明错误的来源并给我们一个回溯。

如果enable_if是特殊关键字或编译器固有的,那么错误很可能更容易解析。

关于c++ - `enable_if` 使编译器难以生成可读的错误消息呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42116274/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com