- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
以下片段是否正确的 C++ 代码?
#include <sstream>
class Foo;
std::ostream& operator<<(std::ostream& str, Foo x); // (A)
namespace test {
class Message {
public:
std::ostringstream str;
};
template<typename T>
Message& operator<<(Message& m, T& t)
{
using ::operator<<;
m.str << t;
return m;
}
}
namespace detail {
class Class {
public:
int i;
Class() : i(5) {}
};
}
std::ostream& operator<<(std::ostream& str, detail::Class& myClass) { // (B)
return str << myClass.i;
}
int main() {
test::Message m;
detail::Class c;
m << c;
}
根据 http://goo.gl/NkPNau GCC 编译得很好,而 Clang 没有找到 operator<<
(B).
如果您想知道:这是来自将 GTest 与自定义 operator<<
结合使用的代码对于 std::set
打印漂亮的断言消息。除了将 operator<<
(B) 在 std 命名空间中(是的,我知道...)。
最佳答案
Clang 在这里是正确的。让我们将 g++ 的行为称为语言扩展。
参数相关查找(又名 Koenig 查找)确实适用,因为 m.str << t
使用匹配 m.str.operator<<(t)
的最佳重载进行解释或 operator<<(m.str, t)
, 第二种情况是 unqualified-id 作为函数名。但是:
14.6.4.2:
For a function call that depends on a template parameter, the candidate functions are found using the usual lookup rules (3.4.1, 3.4.2, 3.4.3) except that:
For the part of the lookup using unqualified name lookup (3.4.1) or qualified name lookup (3.4.3), only function declarations from the template definition context are found.
For the part of the lookup using associated namespaces (3.4.2), only function declarations found in either the template definition context or the template instantiation context are found.
If the function name is an unqualified-id and the call would be ill-formed or would find a better match had the lookup within the associated namespaces considered all the function declarations with external linkage introduced in those namespaces in all translation units, not just considering those declarations found in the template definition and template instantiation contexts, then the program has undefined behavior.
在模板定义上下文中,(B) 不可见。 (B) 在模板实例化上下文中可见,但全局命名空间不是 std::ostringstream
的关联命名空间或 detail::Class
.
关于c++ - Koenig 的查找是否适用于此?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25295345/
大多数时候,简单成员函数的 C++17 推断返回类型可以轻松转换为 C++11 尾随返回类型。 例如中的成员函数 template struct X { T a; auto f() {
以下片段是否正确的 C++ 代码? #include class Foo; std::ostream& operator Message& operator<<(Message& m, T& t
考虑以下代码: enum A : unsigned { a = 1, b = 2, c = 4 }; class B { friend constexpr A operator|(A a1, A
Koenig 查找的基本原理是什么? 无法避免将其视为使您的代码更难阅读且更不稳定的东西。 他们不能定义 Koenig 查找,使其仅适用于特定情况(即:非成员运算符)或明确要求时吗? 最佳答案 IIR
Koenig 查找参数的想法是一件坏事吗? 有了 ADL,我们有: namespace foo { struct bar {}; void baz(bar); } baz(foo::b
作为学习练习,我一直在reimplementing some of the STL algorithm .即使我没有为 std 命名空间 my test code won't compile unle
考虑以下程序: namespace NS2 { class base { }; template int size(T& t) { std:
在编写测试套件时,我需要提供 operator namespace NS1 { class A {}; // this is found by expr in NS2 because of
这个问题的灵感来自 Issue with std::reference_wrapper .比如说,operator bool operator& lhs, const
什么是依赖于参数的查找有哪些好的解释?许多人也称其为Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么不好? 如何运作? 最佳答案 Koenig查找或 Argument Dep
Using code adapted from this answer ,我改编了一个 命名运算符。这是编译器错误: /../ti.cpp:6:31: error: C++ requires a ty
关于什么是参数相关查找有什么好的解释?许多人也称它为 Koenig Lookup。 最好我想知道: 为什么是好事? 为什么是坏事? 它是如何工作的? 最佳答案 Koenig 查找 , 或 Argume
关于什么是参数依赖查找有什么好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何工作的? 最佳答案 Koenig 查询 , 或
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何工作的? 最佳答案 Koenig 查找,或 A
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何运作的? 最佳答案 Koenig 查找,或 A
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何工作的? 最佳答案 Koenig 查找,或 A
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何工作的? 最佳答案 Koenig 查找,或 A
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何运作的? 最佳答案 Koenig 查找,或 A
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何运作的? 最佳答案 Koenig 查找,或 A
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何工作的? 最佳答案 Koenig 查找,或 A
我是一名优秀的程序员,十分优秀!