gpt4 book ai didi

c++ - 奇怪的 C++ 链接错误

转载 作者:可可西里 更新时间:2023-11-01 16:38:05 24 4
gpt4 key购买 nike

当我尝试编译它时,

#include <iostream>

struct K{
const static int a = 5;
};

int main(){
K k;

std::cout << std::min(k.a, 7);
}

我得到关注。 gccclang 都给出类似的错误:

/tmp/x-54e820.o: In function `main':
x.cc:(.text+0xa): undefined reference to `K::a'
clang-3.7: error: linker command failed with exit code 1 (use -v to see invocation)

如果我执行以下操作,它可以毫无问题地编译。这与std::min的写法有关吗?

#include <iostream>

struct K{
const static int a = 5;
};

int main(){
K k;

std::cout << std::min((int) k.a, 7); // <= here is the change!!!
}

另一种避免错误的方法是我自己做 min():

template <class T>
T min(T const a, T const b){
return a < b ? a : b;
}

类 C 预处理器 MIN 也可以正常工作。

最佳答案

std::min 通过引用接受参数。将引用绑定(bind)到一个对象意味着该对象是 odr-used([basic.def.odr]/2 中有一个代码示例与您的示例几乎相同)。

但是在 (int)k.a 情况下,k.a 不是 odr-used;因为它正在执行产生常量表达式的左值到右值转换。 (这里也有一些其他条件,但您的代码没问题)。

如果一个对象是odr-used 那么它必须只有一个定义;违反此规则不需要诊断。所以第一种情况可能会或可能不会被接受;必须接受第二种情况。

在您自己的 min 版本中,它按值获取参数,这类似于 (int)k.a 情况 - 对 k.a 采取的唯一操作 有右值转换来初始化你的 min 的参数。

您可以在 [basic.def.odr] 部分阅读有关odr-use 的完整规则集C++ 标准草案。

关于c++ - 奇怪的 C++ 链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36154544/

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