gpt4 book ai didi

c++ - 内联函数中的 undefined reference ,用一元 + 解决

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:31 25 4
gpt4 key购买 nike

我在启用 c++11 时遇到一个奇怪的 gcc 4.7 问题:

当我想编译这个时:

constexpr unsigned int getDim(const int e){
return (e==1)? A::Set::Dimension :
(
(e==2)? B::Set::Dimension :

(
(e==3)? C::Set::Dimension :
(
+D::Set::Dimension

)
)
);
}

其中对于每个结构 A,B,C,D 定义了 Set 的 typedef,其中相关的 Set 有一个 int Dimension,例如

struct SetOne{
static const int Dimension = 1;
}

struct A{
typedef SetOne Set;
}

如果我不使用 D::Set::Dimension 前面的 unary + 链接器将失败,提示未定义对 SetOne::Dimension 的引用.

这是否与以下问题相同:Undefined reference to static class member

我无法提供 MWE,因为对于一个 .cpp 文件的简单示例,问题就消失了。 ?(但所有针对 A、B、C、D 的定义都在一个头文件中)

有人知道这里可能出了什么问题吗?这是不直观的:-)

观察 2:如果将:+D::Set::Dimension 替换为 0,它编译正常,但为什么将其他语句破解为 A::Set::Dimension 却不行出现相同的链接错误?

最佳答案

在您正在构建的表达式中,三元表达式产生一个左值,这导致静态常量的odr-use。单一定义规则要求所有 odr-used 的静态成员都被定义,因此您需要提供一个定义(在单个翻译单元中)。

So why does the problem go away with the unary +?

一元+不会导致静态成员的odr-use,它只需要一个rvalue,以及它的结果是另一个右值。这通过条件运算符级联出来,因为一旦两个参数之一是右值,表达式的结果也将是右值。最终结果是单个 + 具有强制函数中使用的所有静态常量的 lvalue-to-rvalue 转换的效果,并删除了 ODR-使用

If one replaces: +D::Set::Dimension with 0, it compiles fine

同样,0 是一个右值,它与上面描述的一元 + 具有相同的效果。

关于c++ - 内联函数中的 undefined reference ,用一元 + 解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22308445/

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