gpt4 book ai didi

c++ - 在测试已声明但未定义的运算符是否存在时,static_assert 真的应该成功吗?

转载 作者:行者123 更新时间:2023-11-30 04:17:00 27 4
gpt4 key购买 nike

为什么 static_assert下面成功了吗?我只做了 << operator 是一个 friend ,但我还没有在任何地方创建它。

struct foo {
friend std::ostream &operator<<(std::ostream &stream, const foo &f);
};

template<typename T>
struct bar {
//succeeds:
static_assert(boost::has_left_shift<std::ostream,T>::value, "failure");
};

int main(int,char**) {
bar<foo> b;
return 0;
}

最佳答案

友元声明确定运算符存在。如果你使用它,编译器会接受它:

std::cout << foo();

这也是断言可以测试的所有内容。包含此语句的程序可能不会链接,因为您尚未定义 运算符,但就像编译器一样,断言无法检测到它。它不知道其他翻译单元是否最终会为该功能提供定义。

编译和链接是不同的阶段。

如果您确实在另一个文件中提供了定义,并且您编译了该文件,那么您可以将这两个编译文件链接在一起以形成一个完整的程序。您不必重新编译第一个文件。这就是单独编译的意义所在。

关于c++ - 在测试已声明但未定义的运算符是否存在时,static_assert 真的应该成功吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17368477/

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