使用显式命名空间限定符时模板实例化行为会发生变化吗?

2023-11-21

我一直在试验可组合管道系统,该系统涉及一组可以模板化的“阶段”。每个阶段处理自己的设置、执行和清理,并且模板推导用于构建管道使用的最小“状态”列表。这需要相当多的样板模板代码,这已经显示出一些明显不协调的行为。尽管实验成功,但实际上将其滚动到我们的代码库中会因无效实例化而导致错误。

我们花了一些时间来追踪玩具(工作)解决方案和更丰富的版本之间的差异,但最终它被缩小到一个显式的命名空间规范。

template<typename KeyType = bool>
struct bind_stage
{
    static_assert(!std::is_same<KeyType, bool>::value, "Nope, someone default instantiated me");
};

template<typename BoundStage, typename DefaultStage>
struct test_binding {};

template<template<typename...>class StageTemplate, typename S, typename T>
struct test_binding <StageTemplate<S>, StageTemplate<T>> {};

template<typename T>
auto empty_function(T b) {}

然后我们的主要:

int main()
{
    auto binder = test_binding<bind_stage<int>, bind_stage<>>();
    //empty_function(binder); // Fails to compile
    ::empty_function(binder); // Compiles happily
    return 0;
}

现在,我不确定我是否预料到会失败。一方面,我们创建一个test_binder<bind_stage<int>,bind_stage<bool>>这显然包括无效的实例化bind_stage<bool>作为其类型定义的一部分。这应该无法编译。

另一方面,它纯粹作为名称而不是定义包含在内。在这种情况下,它可能只是一个前向声明的模板,并且只要外部模板中没有任何内容实际具体引用它,我们就希望它能够工作。

我没想到的是两种不同的行为,具体取决于我是否添加了(理论上多余的)全局命名空间说明符。

我已经在 Visual Studio、Clang 和 GCC 中尝试过这段代码。所有这些都有相同的行为,这让我不认为这是一个编译器错误。 C++ 标准中的某些内容是否解释了此行为?


编辑: Daniel Langr 的另一个例子对我来说意义不大:

template <typename T>
struct X {
    static_assert(sizeof(T) == 1, "Why doesn't this happen in both cases?");
};

template <typename T>
struct Y { };

template <typename T>
void f(T) { }

int main() {
    auto y = Y<X<int>>{};
    // f(y); // triggers static assertion
    ::f(y); // does not
}

Either X<int>在定义时实例化Y<X<int>>或者它不是。在非指定范围内使用函数有什么关系?


模板在需要时实例化。那么为什么当一个人执行非限定调用时f(Y<X<int>> {});编译器是否实例化X<int>而当调用时却没有f是合格的::f(X<Y<int>>{})?

原因是参数相关名称查找(ADL) (see [基本.lookup.argdep])仅对不合格的调用发生。

在通话的情况下f(Y<X<int>>{})编译器必须查看的定义X<int>对于友元函数的声明:

template <typename T>
struct X {
    //such function will participate to the overload resolution
    //to determine which function f is called in "f(Y<X<int>>{})"
    friend void f(X&){}
};

ADL 涉及特化模板参数的类型,即函数参数的类型(哎哟...),它是如此令人怀念(因为它几乎只会导致糟糕的意外),以至于有人建议将其删除:P0934

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用显式命名空间限定符时模板实例化行为会发生变化吗? 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • ASP.NET 相当于此 cURL 命令

    我正在使用 Twilio API 它提供了 PHP 和 Ruby 示例 我正在开发一个网站 通过 ASP NET MVC 3 中编码的 API 发送文本消息 并利用我对 WebRequest 对象的有限知识 我能够翻译以下内容 curl X
  • 在带有 map() 的嵌套数据框中使用 filter() (和其他 dplyr 函数)

    我正在尝试使用map of purrr申请包filter 函数存储在嵌套数据框中的数据 为什么不先过滤 然后再筑巢呢 你可能会问 这会起作用 我将使用这样的过程展示我想要的结果 但我正在寻找方法来做到这一点purrr 我只想有一个数据框 其
  • 如何在 C# 中将西里尔字母字符串转换为英语

    是否可以在 C 中将西里尔字母字符串转换为英语 拉丁语 例如 我需要将 转换为 Petroleum 另外 我忘了提到 如果我有西里尔字符串 它需要保持这样 所以我可以以某种方式检查吗 我不熟悉西里尔字母 但如果它只是您想要的西里尔字母到拉丁
  • 了解不支持的操作异常

    我不太明白在哪里可以抛出这个异常 例如 我正在实施Future
  • ADO 组件 CommandTimeout

    我对 TADOQuery TADOCommand 或 TADODataSet 的查询执行超时设置有疑问 我已经对每一个都进行了尝试 我有一个小型应用程序 它连接到数据库并定期执行存储过程 该过程返回数据集作为结果 我的目标是保持此应用程序始
  • 如何从 Oracle SQL 中的 BLOB 获取文本内容

    我试图从 SQL 控制台查看 Oracle BLOB 内部的内容 我知道它包含相当大的文本正文 并且我只想查看文本 但以下查询仅表明该字段中有一个 BLOB select BLOB FIELD from TABLE WITH BLOB wh
  • React axios 错误:请求在 Firefox 中因删除请求而中止,但在 Chrome 中则不然

    我的删除请求在 Firefox 中无法正常工作 遇到了问题 仅给出的信息是 错误请求已中止 所有其他请求都工作正常 但在 Firefox 上 删除请求不起作用 我在 chrome 上测试过 效果很好 import React Compone
  • OS X 10.9 gcc 链接到 clang

    我刚刚注意到安装 OS X 10 9 后 g 编译器链接到 clang 编译器 有没有办法恢复到 gcc g 这种情况已经持续很长时间了 10 8 附带的 GCC 实际上是带有 LLVM 后端的 GCC 前端 获得 GCC 的最佳方式是通过
  • 套接字仅捕获传出数据包,而不捕获传入数据包

    我基于数据包嗅探器这个 经常引用的 示例项目 实现 HTTP 数据包后 我注意到我收到的唯一 HTTP 数据包是请求 我没有收到任何响应 我查看了许多不同的来源 但由于使用的代码通常是相同的 我倾向于认为它可能是我自己的本地代码 当我查看日
  • 将对象转换为 ArrayList 时出现“警告:[未选中] 未选中的转换”

    奇怪的情况 下面是代码 ArrayList
  • 尝试将子图放置在彼此相邻的位置

    我试图将两个子图放置在彼此旁边 而不是放置在彼此下方 我期待看到 sp1 sp2 相反 仅显示第二个图 sp2 from matplotlib import pyplot x 0 1 2 pyplot figure sp1 pyplot s
  • matplotlib:一张图上的多个图

    我有一些代码 import matplotlib pyplot as plt def print fractures fractures xpairs ypairs plt figure 2 plt subplot 212 for i in
  • 在python中创建连续分布

    我在 python 中创建连续分布时遇到了麻烦 它真的开始让我烦恼 我已经阅读并重新阅读这个Python指南 scipy指南 这对我的问题没有帮助 我的代码如下 import sys import scipy stats import nu
  • 如何省略 next.js 中的 html 扩展名?

    我正在使用 next js 构建一个静态网站 我想要我的website com about html工作方式如下 website com about 我不知道为什么它强迫我打字 html 即使我构建我的项目 pages about inde
  • 安装完成后启动应用程序,并开启UAC

    我一直在使用 WIX Windows Installer XML 技术为我们的产品构建一个安装程序 如果安装后选中该复选框 则预期的行为是启动产品 这已经工作了一段时间了 但我们最近发现 Win 7 和 Vista 的 UAC 正在阻止该应
  • 正交投影矩阵的公式?

    我环顾四周 似乎找不到我正在寻找的东西 我找到了 规范公式 但是使用这些公式的最佳方法是什么 我是否必须缩小每个顶点 或者 还有更好的方法 一个公式确实可以帮助我 但我也在寻找有关相对于观看者位置的近Z平面和远Z平面的解释 这是一个合理的来
  • 为什么在 R 中使用 strptime 解析“%Y-%m”给出 NA 结果,但“%Y-%m-%d”有效? [复制]

    这个问题在这里已经有答案了 我在 R 中得到了我不明白的结果 如果我使用strptime如果年份和日期格式为 Y m 如 2009 12 我会得到 NA 结果 但是 如果我添加一天 例如 2009 12 01 并相应地更改格式字符串 我确实
  • 无法编译设置 gradle React Native

    该应用程序在另一台计算机上为我工作 现在从另一台计算机上的存储库下载文件给了我这个问题 失败 构建失败并出现异常 在哪里 设置文件 C Users samue Desktop MCGPS TeachAll android settings
  • 如何在jqgrid构建后设置postData?

    我从传递到视图的模型类生成 jqgrid 我构建并运行 jqgrid 但是 我想在一个视图上设置 postData 在该视图中使用 jqGrid 在调用创建 jqgrid 的帮助程序之后 从该视图中的脚本中设置 而不必更改创建 jqgrid
  • 使用显式命名空间限定符时模板实例化行为会发生变化吗?

    我一直在试验可组合管道系统 该系统涉及一组可以模板化的 阶段 每个阶段处理自己的设置 执行和清理 并且模板推导用于构建管道使用的最小 状态 列表 这需要相当多的样板模板代码 这已经显示出一些明显不协调的行为 尽管实验成功 但实际上将其滚动到