使用 decltype 作为构造函数参数

多门弗兰卡

我很好奇为什么在这种情况下成员声明的顺序是一个问题:

class A
{
public:
    A(decltype(b_) b)
        : b_{b}
    {}

private:
    std::function<void(int, std::string, float)> b_;
};

// error: ‘b_’ was not declared in this scope

虽然只是更改声明顺序有效:

class A
{
    std::function<void(int, std::string, float)> b_;

public:
    A(decltype(b_) b)
        : b_{b}
    {}
};

由于 gcc 和 Clang 都以相同的方式处理它,我会说这不是一个错误,但我仍然觉得它令人困惑。

内森奥利弗

这与完成的类上下文有关一个班级被认为是完成的,只有在:

  • 函数体([dcl.fct.def.general]),

  • 默认参数,

  • noexcept 说明符,或

  • 默认成员初始值设定项

并且成员函数的参数列表不是其中的一部分。这意味着您使用的任何类型都需要被编译器知道(看到)。

class A
{
public:
    A(decltype(b_) b) <- class not complete here
        : b_{b}       <- class is complete here since the mem-initializer list is part of [dcl.fct.def.general]
    {}                <-/

private:
    std::function<void(int, std::string, float)> b_;
};

b_还没有看到,所以你会得到一个编译器错误。

class A
{
    std::function<void(int, std::string, float)> b_;

public:
    A(decltype(b_) b)
        : b_{b}
    {}
};

b_ 已经看过了,所以以后在课堂上使用它没有错误。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用数据构造函数作为函数参数

使用decltype的功能参数类型

使用decltype()声明函数签名

使用可变对象作为构造函数参数

构造函数使用空值作为参数

可以在模板参数中使用decltype吗?

元函数使用 decltype 返回元素类型

在Kotlin中传递和使用函数作为构造函数参数

使用“ this”作为构造函数中方法调用的参数

使用模板化结构作为构造函数参数

使用抽象 Spring bean 作为构造函数参数

使用Clob作为构造函数的参数时出现问题

使用Rcpp公开以指向对象的指针作为参数的构造函数

使用提升的数据构造函数作为幻影参数

如何使用对象类型作为方法/构造函数的参数?

在构造函数中使用多个接口作为参数的依赖注入

在构造函数中使用数组作为参数卡住

为什么我可以在decltype()中使用私有默认构造函数?

成员函数指针的decltype作为c ++ 11中的模板参数

如何使用decltype获取向量元素的类型作为模板参数

从函数的参数声明容器的decltype

使用参数类型的值在尾随返回中是否需要decltype

使用decltype的显式析构函数调用

使用decltype声明整个函数类型本身(不是指针!)

公用“使用” = decltype(<private>)

构造函数使用参数调用构造函数

C ++ 11:使用非静态成员函数作为类构造函数中的默认参数

是否使用成员函数作为构造函数的未定义行为的参数?

在PHP的构造函数中使用函数作为参数的默认值