当前位置: 首页 > 知识库问答 >
问题:

为什么自动类型扣减和模板类型扣减对于带括号的初始值设定项不同?

丰景同
2023-03-14
auto var = { 1, 2, 3 };   // type deduced as std::initializer_list<int>

template<class T> void f(T parameter);

f({ 1, 2, 3 });          // doesn't compile; type deduction fails

我甚至知道这在C++11标准中有什么规定:14.8.2.5/5子弹5:

[如果程序有]一个函数参数,该函数参数的关联参数是初始值设定项列表(8.5.4),但该参数没有std::initializer_list或可能引用CV限定的std::initializer_list类型。[示例:

模板空隙g(T);

共有1个答案

彭宏阔
2023-03-14

有两个重要的原因,模板不做任何演绎(这两个,我记得在讨论的家伙负责)

>

  • 对未来语言扩展的关注(您可以发明多种含义--如果我们想为带支撑的init list函数参数引入完美的转发呢?)

    大括号有时可以有效地初始化依赖于

    template<typename T>
    void assign(T &d, const T& s);
    
    int main() {
      vector<int> v;
      assign(v, { 1, 2, 3 });
    }
    

  •  类似资料:
    • 我认为模板函数可以有默认的参数参数(不是模板参数而是运行时参数)。我们也可以用空括号初始化来初始化一个类。但是编译器如何匹配模板呢? 这段代码为什么要编译,编译器如何进行演绎,以及这个函数调用示例中的参数是什么? 我所理解的是:默认括号初始化调用空构造函数,这是隐式创建的,因为没有用户定义的构造函数或用户定义的默认构造函数。也就是说,我们可以用{}初始化任何包。所以扣除不适用于那里,因为我们不能选

    • 在这种情况下,我总是希望从第一个参数中推导出来,但看起来我没有很好地表达这一点。的类型是,因此: 有没有一种方法可以声明,这样第二个参数就不参与模板参数的推导了?

    • 问题内容: 遵循JEP 286:局部变量类型推断描述 我想知道引入这种限制的原因是什么,例如: 因此,对我而言,逻辑上应该是: 因为Java编译器已经 可以 正确推断数组的类型: 那么有什么障碍呢? 问题答案: 每当我们提高Java中类型推论的范围时,我们都会得到“但是您也可以推论这一点,为什么不呢?”。(或者有时候,礼貌些。) 有关设计类型推断方案的一些一般性意见: 推理方案将始终具有局限性。总

    • 我来自C背景,最近开始学习python。我正在学习索引和选择数据。我遇到了在类,和在熊猫库。我不明白什么是?是功能还是属性?很多时候,我错误地使用而不是,并且没有得到实际的结果(但它不会给我带来错误)。 例子: 有谁能告诉我在哪里可以更多地研究这类运营商。

    • 我已经在网上搜索了这个问题的答案,但我还没有找到一个满意的答案。我想知道初始化结构和类类型的对象的所有规则是什么,特别是在构造函数与带括号的初始化列表方面。结构与类的规则也不同吗? 让我们假设有一个名为矩形的类或结构。 我尝试用C语言中通常使用的方式初始化矩形r,使用一个普通的带括号的初始值设定项列表。但是,g给出以下错误: 嗯……嗯。。。。乍一看,这并不是很有用的错误消息。然而,我认为它与构造函

    • 在模板成员函数中使用std::function时出现编译错误,下面的代码是一个简单的示例: 我用的是C++11和G++4.7