gpt4 book ai didi

c++ - 具有静态存储的变量地址模板

转载 作者:行者123 更新时间:2023-11-30 01:16:43 25 4
gpt4 key购买 nike

C++是否允许模板将静态存储的变量地址作为参数?由于内存地址是不可分割的,并且那些具有静态存储的地址在编译时是已知的,所以这似乎是可能的。

我发现这个问题表明这适用于 int*。

Is it legal C++ to pass the address of a static const int with no definition to a template?

到目前为止,我还没有说服我的编译器接受指向其他类型(如 char*)的指针。

模板通常可以专门用于静态地址吗?如果不是,为什么?

编辑:我应该更明确一点。这是一些使用 g++ 4.9 为我编译的代码。

#include <iostream>

template<int* int_addr>
struct temp_on_int{
temp_on_int() {}
void print() {
std::cout << *int_addr << std::endl;
}
};


template<char* str_addr>
struct temp_on_string{
temp_on_string() {}
void print() {
std::cout << str_addr << std::endl;
}
};

static int i = 0;
static char j = 'h';
// static char* k = "hi";

int main() {

temp_on_int<&i> five;
i = 6;
five.print();

temp_on_string<&j> h;
h.print();

// temp_on_string<k> hi;
// hi.print();
}

注释掉的是不能用 g++ 4.9 编译的东西。所示代码无法在 coliru 上编译。

http://coliru.stacked-crooked.com/a/883df3d2b66f9d61

我是如何编译的:

g++ -std=c++11 -Og -g -march=native -Wall -Wextra -pedantic -ftrapv -fbounds-check -o test16 test16.cpp

尝试编译注释部分时出现的错误:

test16.cpp:33:17: error: the value of 'k' is not usable in a constant expression temp_on_string hi; ^ test16.cpp:22:14: note: 'k' was not declared 'constexpr' static char* k = "hi"; ^ test16.cpp:33:18: error: 'k' is not a valid template argument because 'k' is a variable, not the address of a variable
temp_on_string hi;

最佳答案

14.3.2
  Template non-type arguments [temp.arg.nontype]
    1
      A template-argument for a non-type, non-template template-parameter shall be one of: [...]
  • a constant expression (5.19) that designates the address of a complete object with static storage duration and external or internal linkage or a function with external or internal linkage
     [...]

因为 k 不是常量表达式,所以不能将它用作模板参数。

如果将 k 的声明替换为

static char k[] = "hi";

clang++ 编译它。 g++ 没有;这是 IMO g++ 中的错误。

如果k声明为

namespace { char k[] = "hi"; }

然后 g++ 也编译它。

关于c++ - 具有静态存储的变量地址模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25946089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com