gpt4 book ai didi

c++ - C++名称查找在这里做什么? (& GCC 对吗?)

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

我在一些生产代码中遇到问题,我将其最小化为以下测试用例:

template<typename T>
void intermediate(T t)
{
func(t); // line 4 ("func not declared in this scope")
}

namespace ns {
struct type {};
}

void func(ns::type const & p); // line 11 ("declared here, later")

void foo(ns::type exit_node)
{
intermediate(exit_node); // line 15 ("required from here")
}

GCC 4.5 可以很好地编译它。使用和不使用 -std=c++11,4.7 和 4.9 都会产生如下消息:

test.cpp: In instantiation of ‘void intermediate(T) [with T = ns::type]’:
test.cpp:15:27: required from here
test.cpp:4:5: error: ‘func’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
test.cpp:11:6: note: ‘void func(const ns::type&)’ declared here, later in the translation unit

以下所有三件事都会导致文件成功编译:

  1. func(ns::type) 移动到 ns 命名空间(允许 ADL 在 ns 中找到它)
  2. type 移动到全局命名空间中(允许 ADL 在 :: 中找到它)
  3. 去掉intermediate,直接从foo调用func

那么……这是怎么回事? GCC 拒绝该程序是否合法?为什么在第三个变体(直接从foo调用func)中通过非限定查找找到func,但在原始变体中通过非限定查找找不到实例化点?

最佳答案

一般规则是,任何不在模板定义上下文中的内容只能通过 ADL 获取。换句话说,正常的非限定查找仅在模板定义上下文中执行。

因为在定义 intermediate 时,func 的声明不可见,并且 func 不在与 ns 关联的 namespace 中: :type,代码格式错误。

关于c++ - C++名称查找在这里做什么? (& GCC 对吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29523855/

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