可以在类数据成员中使用模板参数推导吗?

时间:2017-11-20 18:02:38

标签: c++ gcc c++17

C ++ 17引入了template argument deduction

使用gcc-7.2,我可以在函数中轻松使用它:

java.util.logging.ErrorManager: WRITE_FAILURE
Error message - Exception occurred when writing to the output stream.
Exception - java.lang.NullPointerException

我希望在类非静态数据成员中使用相同的语法,例如:

LOGGER.logp(Level.INFO, "class", "method", "foo",
            new Object[] {});

但这会导致gcc int test() { std::pair d(0, 0.0); } ,并传递class Test { std::pair d_{0, 0.0}; };

我尝试了其他一些组合,但似乎都没有。

这是标准的预期行为,还是编译器不完全支持的情况?我无法在标准中找到对类数据成员的任何明确引用。

我的用例当然要复杂得多,使用这种语法会非常方便(想想传递和存储的函数)。

1 个答案:

答案 0 :(得分:10)

  

这是标准的预期行为,还是编译器不完全支持的情况?

是的,这是预期的行为。 [dcl.type.class.deduct]读到:

  

如果推断类类型的占位符在初始化声明([dcl.init])的 decl-specifier-seq 中显示为 decl-specifier 变量,[...]

     

new-type-id type-id <中的 type-specifier-seq 也可以使用推断类类型的占位符 new-expression 的/ em>,或显式类型转换中的 simple-type-specifier (功能表示法)。 推断类类型的占位符不得出现在任何其他上下文中

非静态数据成员不是变量,我们处于其他任何情况。

请注意,对于尝试使用auto声明的非静态数据成员,同样的原则也是如此:

struct X {
    auto y = 0; // error
};

默认的成员初始化程序就是 - 默认的初始化程序。如果您提供了使用不同类型的表达式初始化成员的构造函数,该怎么办?