【发布时间】:2011-01-10 05:52:26
【问题描述】:
我想要一个包含非整数常量的头文件,例如一类。请注意,该常量不需要必须是编译时常量。
static const std::string Ten = "10";
这可以编译但不受欢迎,因为每个编译单元现在都有自己的十个副本。
const std::string Ten = "10";
这将编译,但会因多重定义的十的链接器错误而失败。
constexpr std::string Ten = "10"s;
这会起作用,但前提是字符串构造函数也是 constexpr。会的,但我不能指望每个非整数常量都有一个 constexpr 构造函数……或者我可以吗?
extern const std::string Ten = "10";
这似乎可行,但我担心如果我误以为会出现链接器错误。
inline const std::string Ten( ) { return "10"; }
除了简洁的语法外,它拥有我想要的一切。另外,现在我必须将常量称为函数调用Ten()。
inline const std::string = "10";
这似乎是理想的解决方案。当然inline 变量是标准不允许的。
- c++ 标准中是否有说明 extern 版本应该可以工作,还是我很幸运它可以与 GCC 一起工作?
- 是否有令人信服的理由不允许内联变量?
- c++03 有没有更好的方法,还是 c++0x 有更好的方法?
【问题讨论】:
-
您说您希望“一个文件”拥有它,但又说它不受欢迎,因为它在多个文件中。是哪个?
-
“内联变量”会做什么,而普通的 ol' 常量不会?
-
Caspin,为什么不希望每个编译单元都有自己的 Ten 副本?考虑到“inline const std::string Ten()”版本无论如何都会在每次调用时返回一个新的、单独的对象。
-
@Stefan - 膨胀。这并不重要,但它仍然是不必要的膨胀,通常表明“做错了”。 OP 大概认为他“做错了”,并且像一个理性的人一样,想知道正确的方法。
-
克里斯,好的,但是臃肿到底在哪里?可执行文件大小?
标签: c++ c++11 constants inline