可变参数模板 - 不明确的调用

2023-11-21

以下代码可在 gcc 4.7.2 和 MSVC-11.0 中编译:

template <typename T>
void foo(T bar) {}

template <typename T, typename... Args>
void foo(T bar, Args... args) {}

int main()
{
    foo(0); // OK
}

为什么?我认为这一定是一个不明确的调用:

ISO/IEC 14882:2011

14.5.6.2 函数模板的部分排序 [temp.func.order]

5 ...

[ Example:

template<class T, class... U> void f(T, U...); // #1

template<class T > void f(T); // #2

template<class T, class... U> void g(T*, U...); // #3

template<class T > void g(T); // #4

void h(int i) {

f(&i); // error: ambiguous

g(&i); // OK: calls #3

}

—end example ]

这被认为是当前标准的缺陷。甚至标准本身也依赖于非可变参数模板在规范中的可变参数模板之前进行部分排序std::common_type:

§20.9.7.6 [meta.trans.other] p3

嵌套的 typedefcommon_type::type应定义如下:

template <class ...T> struct common_type;

template <class T>
struct common_type<T> {
  typedef T type;
};

template <class T, class U>
struct common_type<T, U> {
  typedef decltype(true ? declval<T>() : declval<U>()) type;
};

template <class T, class U, class... V>
struct common_type<T, U, V...> {
  typedef typename common_type<typename common_type<T, U>::type, V...>::type type;
};

具体来说common_type<T, U> vs common_type<T, U, V...>.

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

可变参数模板 - 不明确的调用 的相关文章

随机推荐

  • Android套接字连接超时

    我的android应用程序通过socket连接到服务器 这是在node js中编码的 当在前台停留 15 分钟时 它会丢失与服务器的连接 以下是sockt连接服务器的代码 public void connect this connectio
  • 当我尝试从 bash 执行 python 脚本时权限被拒绝? [复制]

    这个问题在这里已经有答案了 我从网上下载了一个 python 脚本 当我尝试从 bash 执行它时 它抛出一个异常 User python script user python script py n some parameter b 输出
  • 如何使用 LibGit2Sharp 获取 Git 上的文件内容?

    我检查了代码BlobFixture cs并发现一些有关读取文件内容的测试 如下所示 using var repo new Repository BareTestRepoPath var blob repo Lookup
  • Handlebars 助手和 Ember Handlebars 助手有什么区别?

    我无法跟上对普通车把和修改后的 Ember 车把助手所做的所有更改 如果我没记错的话你可以用以下方法注册一个助手 Ember Handlebars helper Ember Handlebars registerHelper Ember H
  • Razor 和 HTML 帮助程序

    我正在尝试移植旧的 HTML Image 助手 我确信每个人都曾在某一时刻使用过它 但我遇到了问题 以下编译良好 Html Image my id Content my img png Alt Text 但是当我尝试在视图中使用它时 它只是
  • Java - 在程序中创建新的文件扩展名

    我的目标是为我正在创建的程序创建一个新的文件扩展名 可能不止一个 因此 在四处查看之后 我找到了一些有关该主题的资源 如下所列 以防万一有人想要查看它们并了解我一直在查看的内容 在 Java 应用程序中使用文件关联 创建注册表项以将文件扩展
  • 像表格排序器一样向 添加排序箭头

    我正在尝试向我的表格添加双箭头 向上和向下 例如表格排序器插件可以 这是我的fiddle 由于某种原因 jsfiddle 中甚至没有出现一个箭头 但它可以在我的原始表格上运行 我试过这个 table th addClass headerSo
  • 如何在uWSGI上仅记录5xx错误

    我想让uWSGI只记录服务器错误并避免正常的请求日志 因为文件增长得非常快 并且所有请求日志记录对我来说NGINX都很好 我怎样才能正确配置我的 uwsgi ini 呢 该文档对我来说不是很清楚 最后解决方案非常简单 logto var l
  • 如何在 Ruby 中将数字分组到不同的桶中

    我有一个文件 每行都有数字 0101 1010 1311 0101 1311 431 1010 431 420 我想要一个包含每个数字出现次数的哈希值 在本例中 0101 gt 2 1010 gt 2 1311 gt 2 431 gt 2
  • 自定义视图 - self.frame 不正确?

    所以我有一个自定义的 UIView 类 class MessageBox UIView override init frame CGRect super init frame frame createSubViews required in
  • React-native android WebView在加载之前处理点击的Url

    我正在通过反应本机的 WebView 显示一个网站 此网站上有一个 PassWallet pkpass 文件的链接 不是唯一的用例 当我单击此网站上的任何链接时 我想检查它是否是其他网站或 pkpass 文件或其他文件 当此检查运行时 我不
  • 如果同一日期有超过 3 个使用完整日历的事件,如何更改整个单元格的颜色

    我正在使用完整日历来生成日期并显示事件 一切工作正常 但我想要一个附加功能 即如果单元格颜色超过 3 个事件 我想将单元格颜色更改为红色 如果日期有超过 3 个函数 事件 则整个单元格颜色应更改为红色 以便用户知道预订已满 我还粘贴了下面的
  • 将嵌套 BigQuery 数据导出到云存储

    我正在尝试通过 API 将 bigquery 数据导出到谷歌云存储桶 我从这里改编了一个代码片段https cloud google com bigquery docs exporting data Job job table extrac
  • 使用 C# 和 XDocument/XElement 解析 Soap 响应

    以下是我的 SuperDuperService 的肥皂响应示例
  • 如何更改日期时间中的时间?

    我怎样才能只改变我的时间DateTime变量 s DateTime s some datetime 您无法更改 DateTime 值 它是不可变的 但是 您可以更改该变量以获得新值 仅更改时间的最简单方法是创建具有相关时间的 TimeSpa
  • FFMPEG 将两个视频合并为一个并排具有相同质量的输出

    我已经在处理 3D 视频项目 但遇到了问题 我有视频的左通道和右通道 我需要将它们并排合并 我已经阅读了一些有关此问题的博客 并得到了以下代码 ffmpeg i avatar35l avi vf movie avatar35r avi in
  • 多个fs.write追加到同一个文件可以保证执行顺序吗?

    假设我们有这样一个程序 imagine the string1 to string1000 are very long strings which will take a while to be written to file system
  • python 中字符串中每隔一个逗号后的字符串分割

    我有一个字符串 其中包含用逗号分隔的每个单词 我想在 python 中用每个其他逗号分割字符串 我该怎么做 eg xyz abc jkl pqr 应该给 xyzabc 作为一根绳子和 jklpqr 作为另一个字符串 在每个逗号上分割 然后重
  • | 有什么区别?和 ||在 MATLAB 中?

    两者有什么区别 and MATLAB 中的逻辑运算符 我确信您已经阅读过相关文档短路运算符 并且对于逐元素运算符 一个重要的区别是逐元素运算符可以对数组进行操作 而短路运算符仅适用于标量逻辑操作数 但关键的区别可能是短路问题 对于短路运算符
  • 可变参数模板 - 不明确的调用

    以下代码可在 gcc 4 7 2 和 MSVC 11 0 中编译 template