C++ 17引入了模板参数推导.
使用gcc-7.2,我可以在一个函数中轻松使用它:
int test() {
std::pair d(0, 0.0);
}
Run Code Online (Sandbox Code Playgroud)
我期望在类非静态数据成员中使用相同的语法,例如:
class Test {
std::pair d_{0, 0.0};
};
Run Code Online (Sandbox Code Playgroud)
但这会导致GCC error: invalid use of template-name ... without an argument list
,与--std=c++17
通过.
我尝试了其他一些组合,但似乎都没有.
这是标准的预期行为,还是编译器不完全支持的情况?我找不到标准中对类数据成员的任何明确引用.
我的用例当然要复杂得多,这种语法非常方便(想想传递和存储的函数).
假设我的功能如下:
int test(std::array<char, 8>* data) {
char buffer[data->size() * 2];
[... some code ...]
}
Run Code Online (Sandbox Code Playgroud)
显然,可以在编译时评估缓冲区的大小:数据有一个 constexpr
大小为8个元素,8*2 = 16个字节.
然而,编译时-Wall
,-pedantic
而-std=c++11
我得到的臭名昭著的错误:
警告:可变长度数组是C99功能[-Wvla-extension]
我相信它是有道理的:array::size()
是constexpr
,但它仍然是一种方法,在上面的函数中我们仍然必须取消引用指针,而不是constexpr
.
如果我尝试类似的东西:
int test(std::array<char, 8>& data) {
char buffer[data.size() * 2];
[...]
}
Run Code Online (Sandbox Code Playgroud)
gcc
(尝试过5.2.0版)似乎很高兴:没有警告.
但是对于clang++
(3.5.1),我仍然会收到一个抱怨可变长度数组的警告.
在我的情况下,我不能轻易改变签名test
,它必须采取指针.那么......几个问题:
在constexpr上下文中获取std::array
指针大小的最佳/最标准方法是什么?
预期指针与引用的行为有何不同?哪个编译器对警告是正确的,gcc
或者clang
?