gpt4 book ai didi

c++ - 匿名命名空间中的 constexpr 字符串文字?

转载 作者:可可西里 更新时间:2023-11-01 18:26:39 28 4
gpt4 key购买 nike

我有以下示例代码,它使用字符串文字作为模板参数,这样基类模板就可以访问该字符串。

代码可以编译,但我收到一个我不完全理解的警告:

warning: ‘ns::bar::type’ has a base ‘ns::base<((const char*)(& ns::bar::name))>’ whose type uses the anonymous namespace [enabled by default]

下面的工作示例代码:

// "test.h"
#pragma once

namespace ns
{
template <char const* str>
struct base
{
const char *name() const { return str; }
};

namespace bar
{
static constexpr char name[] = "bar";
struct type : base<name> {}; // <-- this line here
}
}

// main.cpp
#include <iostream>
#include "test.h"

int main()
{
ns::bar::type f;
std::cout << f.name() << std::endl;
return 0;
}

所以我的问题是:

  1. 这个警告是什么意思?
  2. 按照我在这里所做的方式将字符串文字作为模板参数传递是否安全?

(注意这是 gcc 4.7.2)

最佳答案

问题在于 static constexpr char name[] = "bar"; 具有内部链接。

header 中定义的具有内部链接的任何类型在包含该 header 的每个文件中都是不同的类型。

这很少是意图 - 因此是警告。

在源文件中完成此操作时没有警告的原因是因为该类型永远不会被多个文件引用 - 因此它将始终是该类型。

关于c++ - 匿名命名空间中的 constexpr 字符串文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14951200/

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