为什么这样调用构造函数时模板参数推导失败?

Brian Bi

以下内容无法编译:

struct S {
    template <class T> S(T) {}
};
void f(int) {}
int main() {
    S(f);
}

g ++-4.9说

template.cpp: In function ‘int main()’:
template.cpp:6:8: error: no matching function for call to ‘S::S()’
     S(f);
        ^
template.cpp:6:8: note: candidates are:
template.cpp:2:24: note: template<class T> S::S(T)
     template <class T> S(T) {}
                        ^
template.cpp:2:24: note:   template argument deduction/substitution failed:
template.cpp:6:8: note:   candidate expects 1 argument, 0 provided
     S(f);
        ^
template.cpp:1:8: note: constexpr S::S(const S&)
 struct S {
        ^
template.cpp:1:8: note:   candidate expects 1 argument, 0 provided
template.cpp:1:8: note: constexpr S::S(S&&)
template.cpp:1:8: note:   candidate expects 1 argument, 0 provided

铛给出了类似的错误。

另一方面,将编译以下内容:

struct S {
    template <class T> S(T) {}
};
void f(int) {}
int main() {
    S s = S(f); // this line was changed
}

那么这是怎么回事?

菲利普·罗森-refp

问题

您编写的代码并不代表您的实际意思,实际上是在声明一个S具有名称的类型的变量f不是S使用f作为参数构造type的未命名实体

注意:当您将行更改S s = S(f)为时,您将声明一个名为stype的变量S,并使用临时初始化S(f)(即将使用S副本构造函数进行初始化)。s


解决方案

将类型包装在括号中,或使用统一初始化(在C ++ 11中引入)。

(S) (f); // creates a temporary of type S initialized with `f`

S { f }; // c++11

原因

标准(n3797)表示T(x)等同于T x声明变量,如以下部分所述:

8.3p6声明符的含义 [dcl.meaning]

在声明T DD具有以下形式

( D1 )

所包含的说明符-ID的类型是一样的包含的说明符-ID的声明

T D1

括号不会更改嵌入的声明符id的类型,但可以更改复杂声明符的绑定。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用模板构造函数时,模板参数推导/替换失败,为什么?

来自分类Dev

为什么模板参数推导失败?

来自分类Dev

为什么函数返回结构模板时无法推导模板参数

来自分类Dev

当参数包含std :: function ...时,C ++模板参数推导失败,并显示错误“候选模板被忽略” ...为什么?

来自分类Dev

当参数包含std :: function ...时,C ++模板参数推导失败,并显示错误“候选模板被忽略” ...为什么?

来自分类Dev

为什么模板参数推导因std :: function回调的可变参数模板参数而失败?

来自分类Dev

从函数调用中推导模板参数包

来自分类Dev

模板参数推导失败

来自分类Dev

为什么不调用模板化副本构造函数?

来自分类Dev

用`std :: function`和先前推导出的模板参数替换失败-为什么?

来自分类Dev

为什么构造函数无法推断出模板参数?

来自分类Dev

模板参数推导失败,使用函数指针作为参数

来自分类Dev

为什么创建类Object数组时不能调用参数化构造函数?

来自分类Dev

将原子传递给可变参数时,为什么要调用复制构造函数?

来自分类Dev

模板函数参数推导

来自分类Dev

从构造函数中的成员变量推导模板参数

来自分类Dev

当将对象作为参数传递时,为什么要调用析构函数但不调用构造函数?

来自分类Dev

为什么在函数返回时不调用复制构造函数?

来自分类Dev

未在函数调用中使用的参数的模板参数推导

来自分类Dev

Swift构造函数为什么使用命名参数调用?

来自分类Dev

Swift构造函数为什么使用命名参数调用?

来自分类Dev

为什么我不能为此函数推导出模板参数?

来自分类Dev

传递给模板函数的两个lambda使参数的类型推导不明确-为什么?

来自分类Dev

为什么不能在函数中使用模板别名作为参数并自动推导?

来自分类Dev

为什么我不能为此函数推导出模板参数?

来自分类Dev

函数采用Eigen :: Tensor-模板参数推导失败

来自分类Dev

ASPX-为什么调用无参数构造函数,而跳过带参数的构造函数?

来自分类Dev

模板参数推导失败,SFINAE

来自分类Dev

模板参数推导失败,typedef?

Related 相关文章

  1. 1

    使用模板构造函数时,模板参数推导/替换失败,为什么?

  2. 2

    为什么模板参数推导失败?

  3. 3

    为什么函数返回结构模板时无法推导模板参数

  4. 4

    当参数包含std :: function ...时,C ++模板参数推导失败,并显示错误“候选模板被忽略” ...为什么?

  5. 5

    当参数包含std :: function ...时,C ++模板参数推导失败,并显示错误“候选模板被忽略” ...为什么?

  6. 6

    为什么模板参数推导因std :: function回调的可变参数模板参数而失败?

  7. 7

    从函数调用中推导模板参数包

  8. 8

    模板参数推导失败

  9. 9

    为什么不调用模板化副本构造函数?

  10. 10

    用`std :: function`和先前推导出的模板参数替换失败-为什么?

  11. 11

    为什么构造函数无法推断出模板参数?

  12. 12

    模板参数推导失败,使用函数指针作为参数

  13. 13

    为什么创建类Object数组时不能调用参数化构造函数?

  14. 14

    将原子传递给可变参数时,为什么要调用复制构造函数?

  15. 15

    模板函数参数推导

  16. 16

    从构造函数中的成员变量推导模板参数

  17. 17

    当将对象作为参数传递时,为什么要调用析构函数但不调用构造函数?

  18. 18

    为什么在函数返回时不调用复制构造函数?

  19. 19

    未在函数调用中使用的参数的模板参数推导

  20. 20

    Swift构造函数为什么使用命名参数调用?

  21. 21

    Swift构造函数为什么使用命名参数调用?

  22. 22

    为什么我不能为此函数推导出模板参数?

  23. 23

    传递给模板函数的两个lambda使参数的类型推导不明确-为什么?

  24. 24

    为什么不能在函数中使用模板别名作为参数并自动推导?

  25. 25

    为什么我不能为此函数推导出模板参数?

  26. 26

    函数采用Eigen :: Tensor-模板参数推导失败

  27. 27

    ASPX-为什么调用无参数构造函数,而跳过带参数的构造函数?

  28. 28

    模板参数推导失败,SFINAE

  29. 29

    模板参数推导失败,typedef?

热门标签

归档