调用 ADL 时,表达式和命名空间之间是否会发生冲突
Are collisions between expressions and namespaces expected when invoking ADL?
给定以下示例,我希望解析器将std识别为函数:
#include <algorithm>
namespace test
{
class foo{};
void std(foo f);
}
int main()
{
std(test::foo());
return 0;
}
但是,在 GCC 4.8.4 中,这会导致错误 - "错误:意外的命名空间名称'std':预期的表达式。
使用 clang 5.0,我得到"错误:意外的命名空间名称'std':预期的表达式">
这是意料之中的吗?我无法想象解析器在这里没有足够的上下文来区分表达式和命名空间?
编辑:示例使用应调用 ADL 的更复杂的类型。在我的实际用例中,代码是通用的,我需要 ADL。
没有 ADL 用于int
。
如果正常的非限定查找发现"既不是函数也不是函数模板的声明"(例如命名空间的声明(,则也没有 ADL。
由于几个原因,您的示例不起作用。
-
它不使用 ADL。 如果函数的参数是在命名空间中定义的类型,则将使用 ADL。例如
namespace test { struct bar {}; void foo(bar b) {} } // uses ADL to resolve to test::foo. foo(test::bar());
-
std
是一个命名空间。在没有任何其他作用域限定符的情况下使用时,它是命名空间的名称。因此,即使使用了命名空间中定义的类型,也不会使用 ADL。因此,以下内容也不正确。namespace test { struct bar {}; void std(bar b) {} } std(test::bar());
请注意,您可以使用:
namespace test
{
struct bar {};
void std(bar b) {}
}
test::std(test::bar());
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 模块名称是否驻留在单独的"name space"中,或者它们可能与例如变量名称发生冲突?
- 是否有具有用户定义的冲突处理程序的 std::唯一样式库算法
- 调用 ADL 时,表达式和命名空间之间是否会发生冲突
- Windows C++程序中的访问冲突是否总是立即崩溃
- 这Microsoft CFileDialog 示例是否会导致潜在的内存冲突
- 使用Boost的班级名称冲突是否存在问题
- OpenCV和Tesseract之间是否存在任何冲突
- 加载具有相同符号的两个共享库时是否存在符号冲突
- 如果从其他线程访问(读/写)src缓冲区,是否有可能从memcpy获得访问冲突
- 在这个例子中,是否可以避免严格的混叠规则冲突
- crtdbg.h 是否与 DirectX 冲突?
- C++11 内存模型是否可以防止内存撕裂和冲突?
- 没有冲突是否意味着一切正常?