Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用静态constexpr成员数组作为模板参数中的指针_C++_Templates_Static_Constexpr_Non Type - Fatal编程技术网

C++ 使用静态constexpr成员数组作为模板参数中的指针

C++ 使用静态constexpr成员数组作为模板参数中的指针,c++,templates,static,constexpr,non-type,C++,Templates,Static,Constexpr,Non Type,以下main.cpp说明了该问题: #include <type_traits> template <class T, std::size_t N> struct Array { T data_[N]; }; template <const std::size_t* EltArray, std::size_t EltCount> struct Foo { }; int main() { // SIDE NOTE if arr is no

以下main.cpp说明了该问题:

#include <type_traits>

template <class T, std::size_t N>
struct Array
{
    T data_[N];
};

template <const std::size_t* EltArray, std::size_t EltCount>
struct Foo
{

};

int main()
{
    // SIDE NOTE if arr is not declared static: the address of 'arr' is not a valid template argument
    // because it does not have static storage duration
    static constexpr std::size_t arr[3] = {1, 2, 3};
    Foo<arr, 3> foo;// WORKING

    static constexpr Array<std::size_t, 3> arr2 = {1, 2, 3};
    static constexpr const std::size_t* arr2_ptr = arr2.data_;
    Foo<arr2_ptr, 3> foo2;// ERROR:
    // 'arr2_ptr' is not a valid template argument of type 'const size_t*'
    // {aka 'const long long unsigned int*'} because
    // 'arr2.Array<long long unsigned int, 3>::data_' is not a variable

    static constexpr const std::size_t* test = std::integral_constant<const std::size_t*, arr2_ptr>{};// ERROR:
    // 'arr2_ptr' is not a valid template argument of type 'const long long unsigned int*' because
    // 'arr2.Array<long long unsigned int, 3>::data_' is not a variable

    return 0;
}
#包括
模板
结构数组
{
T数据_un;
};
模板
结构Foo
{
};
int main()
{
//如果arr未声明为静态,请注意:“arr”的地址不是有效的模板参数
//因为它没有静态存储持续时间
静态constexpr std::size_t arr[3]={1,2,3};
Foo-Foo;//正在工作
静态constexpr数组arr2={1,2,3};
静态constexpr const std::size\u t*arr2\u ptr=arr2.data\u2;
Foo foo2;//错误:
//“arr2\u ptr”不是类型为“const size\u t*”的有效模板参数
//{aka'const long long unsigned int*'}因为
//“arr2.Array::data\”不是变量
static constexpr const std::size\u t*test=std::integral\u常量{};//错误:
//“arr2_ptr”不是类型为“const long unsigned int*”的有效模板参数,因为
//“arr2.Array::data\”不是变量
返回0;
}
我不明白为什么arr2.data不像arr那样可重用。有人能解释一下吗

我正在使用gcc:mingw-w64\x86_64-8.1.0-posix-sjlj-rt_v6-rev0


g++.exe-Wall-std=c++2a-fconcepts-O2

我想分享我刚刚在open std中找到的答案和一个符合标准的解决方案

我们都知道不能将任何变量作为非类型传递

你知道我们可以传递一个常量引用到任何我们想要的东西吗

因此,解决方案是:

#include <array>

// When passing std::array<std::size_t, EltCount> (by value), i get the error:
// 'struct std::array<long long unsigned int, EltCount>' is not a valid type for a template non-type parameter

template <std::size_t EltCount, const std::array<std::size_t, EltCount>& Elts>
struct Foo {};

static constexpr std::array<std::size_t, 3> arr = {1, 2, 3};

int main()
{
    Foo<3, arr> foo;// WORKING

    return 0;
}
#包括
//当传递std::array(按值)时,我得到错误:
//“struct std::array”不是模板非类型参数的有效类型
模板
结构Foo{};
静态constexpr std::array arr={1,2,3};
int main()
{
Foo-Foo;//正在工作
返回0;
}
第一个问题的答案是:

N4296的报价

14.3.2模板非类型参数[临时参数非类型]

对于引用或指针类型的非类型模板参数 常量表达式的值不应指(或对于指针类型,不应指以下地址): (1.1)-子对象(1.8)


故事的寓意:我们可以通过引用而不是指针来做我们想做的事情。

我没有看到来自的任何阻塞,但由于所有的clang/gcc/msvc都拒绝它,我应该会错过一些东西。arr2\u ptr编译,但错误涉及arr2::data。\因此gcc似乎很懒惰。我在std::array中得到了相同的错误