- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有以下工作代码:
#include <string>
#include <iostream>
class A {
public:
const std::string test = "42";
//static const std::string test = "42"; // fails
};
int main(void){
A a;
std::cout << a.test << '\n';
}
为什么不能使测试成为 static const
有充分的理由吗?我确实了解在 c++11 之前它受到标准的约束。我认为 c++11 引入了类内初始化以使其更友好一些。很长一段时间以来,我也没有这样的语义可用于整数类型。
当然,它适用于 const std::string A::test = "42";
我猜想,如果您可以使它成为非静态的,那么问题就出在两者之一上。在类外范围内初始化它(通常 const
是在对象实例化期间创建的)。但是,如果您要创建一个独立于该类的任何其他成员的对象,我认为这不是问题。第二个是对静态成员有多个定义。例如。如果它被包含在几个 .cpp
文件中,进入几个目标文件,那么链接器在将这些对象链接在一起时会遇到麻烦(例如链接到一个可执行文件中),因为它们将包含相同的符号。我的理解,这正好等于在header中class声明下提供了out-of-class权限,然后在不止一个地方包含了这个common header。我记得,这会导致链接器错误。
但是,现在处理这个的责任转移到了用户/程序员身上。如果一个人想要一个带有 static
的库,他们需要提供一个类外定义,将它编译成一个单独的对象文件,然后将所有其他对象链接到这个对象,因此只有符号二进制定义的一份拷贝。
我阅读了 Do we still need to separately define static members, even if they are initialised inside the class definition? 中的答案和 Why can't I initialize non-const static member or static array in class? .
我还想知道:
constexpr
和用户定义来解决吗文字机制。 clang 和 g++ 都说变量不能有非文字类型。也许我可以做一个。 (也许出于某种原因这也是一个坏主意)static const
所有都应该是二进制精确的不可变拷贝。如果我遗漏或误解了什么,也请发表评论。
最佳答案
您的问题分为两部分。标准怎么说?为什么会这样?
对于const std::string
类型的静态成员,要求定义在类说明符之外,并且在其中一个翻译单元中有一个定义。这是单一定义规则的一部分,并在 C++ 标准的第 3 条中指定。
但为什么呢?
问题在于,具有静态存储持续时间的对象需要在最终程序镜像中进行唯一的静态存储,因此需要从一个特定的翻译单元进行链接。类说明符在一个翻译单元中没有归属地,它只是定义类型(需要在使用它的所有翻译单元中进行相同的定义)。
常量积分不需要存储的原因是它被编译器用作常量表达式并在使用时内联。它永远不会出现在程序图像中。
然而,复杂类型,如 std::string
,具有静态存储持续时间需要存储,即使它们是 const
。这是因为它们可能需要动态初始化(在进入 main 之前调用它们的构造函数)。
您可能会争辩说,编译器应该在使用它们的每个翻译单元中存储有关具有静态存储持续时间的对象的信息,然后链接器应该在链接时将这些定义合并到程序镜像中的一个对象中。我猜测为什么没有这样做,是因为它需要链接器提供太多智能。
关于c++ - 为什么我不能使类内初始化 `const const std::string` 成为静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17351870/
我正在学习 Go,但我无法在任何地方找到这个答案。 Web开发中的文件扩展名是否有任何官方标准?我见过多种约定,例如 .tmpl 和 .gtpl,这是什么?谢谢。 最佳答案 没有固定的标准,但有一些相
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 8 年前关闭。 Improve
假设我有两个类(class) Widget ^ | Window 我还有另一个类应用程序: 定义如下 class Application { public: ... private:
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我多年来一直在使用 MySQL,直到去年左右,主要是在较小的项目上。我不确定是语言的性质还是我缺乏真正的教程让我不确定我正在写的东西是否是优化目的和扩展目的的正确方法。 虽然自学 PHP,但我对自己和
我已经多次读到 EJB 是重量级的……但昨晚我正在浏览关于 EJB 的 Java EE 6 教程,它们似乎只是普通的 Java 对象,除了它们可以有像 Stateless 或 Singletons 这
如何使此 SimpleModal 脚本在页面加载时加载而不是单击按钮?谢谢=) Demo 基本模态对话框 对于此演示,SimpleModal 使用此“隐藏”数据作为其内容。您还可以使用标准 HTML
这是 Haskell 中的代码: class Fooable a where foo :: a -> a instance Fooable (a, a) where foo = ...
是否有推荐的方法来测试 Actor 是否使用 be 正确改变了其行为?我更喜欢使用 FSM 的原因之一是因为我可以轻松验证 Actor 是否已更改其行为。我不知道在使用 become/unbecome
我正在构建一个位于“php my admin”中的表,我是在第一次点击其中一个“th”它的 asc 时这样做的,现在我试图在第二次点击时制作 desc ..有什么想法吗? 阿姆..很多我不记得了抱歉.
考虑以下网页。 我在 Firefox 中打开此页面,打开 JS 控制台并键入以下内容。 > document.getElementById(
如何让自己成为 postgresql 的 super 用户? 我一直在尝试创建数据库,但我不断收到以下错误: createdb: database creation failed: ERROR: pe
Query没有太大帮助。 如前所述here , PostgreSQL 是 ORDBMS。 here ,它解释了 PostgreSQL 是 RDBMS。 PostgreSQL 是一个 ORDBMS 是什
我已经看到,当在导航元素中使用的链接中垂直/水平居中文本时,将链接设置为 flex 容器会很有用。我没有意识到链接文本实际上可以是一个(单个) flex 元素。我可以看到链接中的 span 元素可以是
我见过很多说明如何找到给定集合的子集的示例,但是您如何将一个集合设为另一个集合的子集?所以集合 B 是集合 A 的子集,这将如何实现?我目前正在使用递归性质的方案,但是这本书只展示了如何列出子集而不是
有些程序会根据其标准输出是否为 tty 来更改其输出。因此,如果您将它们放入管道或重定向它们,输出将与您的 shell 中的不同。这是一个例子: $ touch a b c # when runnin
我正处于项目的开始阶段,到目前为止我一直在使用默认的 MySQL 数据库。 对了,默认的数据库有名字吗? 我的问题是如何在不删除当前表和创建新表的情况下将现有表更改为 utf-8 和 InnoDB。是
我正在尝试编写一个过滤器来包装数据以遵循 JSON API spec到目前为止,它适用于我直接返回 ActionResult 的所有情况,例如 ComplexTypeJSON。我试图让它在像 Comp
我在 Storyboard 上创建了一个带有一个 UITextField 的自定义 UIViewController。在 viewDidLoad 上,我将 UITextFIeld 设置为 become
我已经看到关于 valueless_by_exception 方法的 cppreference 的以下注释: A variant may become valueless in the followi
我是一名优秀的程序员,十分优秀!