【问题标题】:User-defined deduction guide for std types用户定义的标准类型推导指南
【发布时间】:2023-03-31 15:58:01
【问题描述】:

由于某种原因,clang 中的 std::initializer_list 仍然缺少预期的 CTAD

std::initializer_list l{1,2,3}; // error in clang

添加如下用户自定义指南可以fix the issue:

namespace std {
    template<class T> 
    initializer_list(const initializer_list<T>&) -> initializer_list<T>; 
} 

但是是否允许为std:: 类型的 CTAD 添加用户定义的指南?

【问题讨论】:

  • 上次检查时,我的印象是 Clang 在这里是正确的,std::initializer_list l{1,2,3}; 不应该编译。你确定标准允许吗?
  • @HolyBlackCat 这就是我的问题。
  • 您的问题提出了不同的问题,是否允许添加...
  • @Dani 是的。现在我看到了区别。感谢您指出这一点。
  • @HolyBlackCat 尽管符合标准(如果有的话),但像 'std::initializer_list l{1,2,3};' 这样的代码我认为它应该对常规 c++ 开发人员有效。因此,如果缺乏标准,那么标准应该是固定的。

标签: c++ language-lawyer clang++ ctad


【解决方案1】:

在标准库类型中添加推导指南是UB[namespace std]§4.4

如果 C++ 程序声明:[...]

,则它的行为是未定义的
  • 任何标准库类模板的演绎指南。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 2018-12-11
    相关资源
    最近更新 更多