constexpr 成员函数,C++中的 std::向量数据成员
constexpr member function with std::vector data member in C++
我正在尝试在C++类中实现一个返回模板参数的constexpr成员函数。代码应该是 c++11 兼容的。但是,当模板化类还包含 STL 容器作为数据成员(如 std::vector(时,我遇到了编译问题(constexpr 成员函数未触及这些容器(。
以下代码给出了一个最小示例:
#include <vector>
#include <iostream>
#include <array>
template<size_t n>
struct A
{
constexpr size_t dimensions() const
{
return n;
}
private:
std::vector<double> a;
};
int main(int argc,char ** argv)
{
auto a=A<3>();
std::array<double,a.dimensions()> arr;
}
代码使用命令正确编译
g++ -std=c++14 -O3 quickTest.cpp -o test -Wall
clang++ -std=c++11 -O3 quickTest.cpp -o test -Wall
但在我使用 时失败
g++ -std=c++11 -O3 quickTest.cpp -o test -Wall
出现错误:
quickTest.cpp:22:33: error: call to non-‘constexpr’ function ‘size_t A<n>::dimensions() const [with long unsigned int n = 3; size_t = long unsigned int]’
std::array<double,a.dimensions()> arr;
~~~~~~~~~~~~^~
quickTest.cpp:10:20: note: ‘size_t A<n>::dimensions() const [with long unsigned int n = 3; size_t = long unsigned int]’ is not usable as a ‘constexpr’ function because:
constexpr size_t dimensions() const
^~~~~~~~~~
quickTest.cpp:22:33: error: call to non-‘constexpr’ function ‘size_t A<n>::dimensions() const [with long unsigned int n = 3; size_t = long unsigned int]’
std::array<double,a.dimensions()> arr;
~~~~~~~~~~~~^~
quickTest.cpp:22:33: note: in template argument for type ‘long unsigned int’
为什么代码不用gcc -std=c++11
编译,而是用clang++ -std=c++11
编译?如何使此代码片段适用于可能不支持 c++14/17 而仅支持 c++11 的旧版本的 gcc?
我正在使用 gcc 8.1.1 和 clang 6.0.1
C++11 有一个规则 [dcl.constexpr]/8:
。该函数所属的类应为文本类型 ([basic.types](。
struct A
不是文字类型,因为vector
,因此它的非静态成员函数不能constexpr
。
因此,GCC 在 C++11 模式下拒绝代码是正确的。
C++14取消了这一限制。
C++11 的解决方案是声明dimensions()
static
:
static constexpr size_t dimensions()
{
return n;
}
现场演示
相关文章:
- std::向量与传递值的动态数组
- 如何在旧c++中初始化const-std向量
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- 如何初始化 std::向量的映射?
- 迭代时将指向differents类型的指针保存在std::向量中
- std::向量迭代器和调整大小/保留的奇怪/有趣行为
- yaml-cpp到std::向量迭代的怪异行为
- 故意泄漏std::向量的内存
- 调整STD ::向量的大小是否可以降低其能力
- std ::向量距离函数如何给出比.size()更高的值
- C++ std::向量插入两个元素替代算法失败
- 错误:数字常数之前的预期无限制ID:std :: array和std ::向量大小分配
- 在我提供的此示例中,如何将2维std ::向量的逻辑更改为具有向量[row] [col] [col] [col] [co
- GUI滑块的动态数量,该数量更新具有回调中值的std ::向量
- 是一个std ::向量线程,我的目的是安全的
- 将具有std ::向量的C 函数称为Julia的输入和输出参数
- 将std ::向量作为指针参考
- STD ::向量如何调整其内部缓冲区大小
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区