问题标签 [template-argument-deduction]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
606 浏览

c++ - make_pair 如何隐式推断类型?

make_pair推导类型是众所周知的。这就是它存在并且方便的原因。现在看这个例子

现在我想了解在上面的行中究竟何时进行扣除:

它是否会创建一对然后将其隐式强制转换doubleint和?charint

0 投票
4 回答
565 浏览

c++ - 《C++ Templates - The Complete Guide》这本书似乎有矛盾之处

在“C++ 模板 - 完整指南”一书的部分2.4 Overloading Function Templates中,您将找到以下示例:

然而,在附录 B 的 B.2 简化重载解决方案中,作者指出:

请注意,重载决议发生模板参数推导之后,... (2)

根据(2)::max(7,42)应该max<int>通过参数推导调用。

0 投票
1 回答
586 浏览

c++ - 推导可变参数模板连接

所以问题很简单,编译器是否应该能够根据标准推断模板连接?

例子:

print_function给定参数和显式模板,编译器是否应该能够确定该函数可以通过?

看更多; 上一个问题

0 投票
1 回答
481 浏览

c++ - 为什么在右值的情况下转发引用不会推断为右值引用?

我知道,给定一个初始化转发/通用引用的表达式,左值被推断为类型T&和右值类型T(而不是T&&)。

因此,为了只允许右值,需要写

并不是,

我的问题是,为什么对于转发引用,右值被推断为类型T而不是T&&?我想,如果它们被推断为,T&&那么相同的引用折叠规则也T&& &&T&&.

0 投票
5 回答
2834 浏览

c++ - C++11 模板参数类型推导失败

我试图了解如何使用 C++(11) <type_traits>

这是我的简单测试程序

使用 GCC 4.8.1 编译时,错误为

我不知道为什么 GCC 不能推断出模板参数U。任何人都知道我的代码缺少什么信息,这就是我如何在 C++11 中编写一个程序,将无符号整数类型作为第一个参数,将有符号整数类型作为第二个参数?

0 投票
1 回答
4500 浏览

c++ - 模板推导中的偏序过程是什么

阅读 C++11 标准我无法完全理解以下语句的含义。例子非常受欢迎。

两组类型用于确定偏序。对于涉及的每个模板,都有原始函数类型和转换后的函数类型。[注意:转换类型的创建在 14.5.6.2 中描述。— 尾注] 推演过程使用转换后的类型作为参数模板,将另一个模板的原始类型作为参数模板。对于偏序比较中涉及的每种类型,此过程执行两次:一次使用转换后的模板 1 作为参数模板,模板 2 作为参数模板,再次使用转换后的模板 2 作为参数模板和模板 1作为参数模板
——N3242 14.8.2.4.2

0 投票
3 回答
534 浏览

c++ - c++模板化构造函数错误

更多的模板问题...我喜欢 C++,但有时我讨厌它。

我无法弄清楚为什么编译器在这里抱怨,以及我能做些什么。

这里发生了什么?

我正在使用 MSVC2008。

0 投票
8 回答
2113 浏览

c++ - 使用一个参数进行模板参数推导?

假设我有一个模板函数,assign(). 它接受一个指针和一个值,并将值分配给指针的目标:

在这种情况下,我总是想T从第一个参数中推断出来,但看起来我没有很好地表达这一点。2的类型是int,所以:


有没有办法可以声明assign()第二个参数不参与模板参数推导?

0 投票
3 回答
1543 浏览

c++ - 为什么大括号初始值设定项的自动和模板类型推导不同?

我知道,给定一个大括号初始值设定项,auto将推导出一个 类型std::initializer_list,而模板类型推导将失败:

我什至知道这在 C++11 标准中是在哪里指定的:14.8.2.5/5 bullet 5:

[如果程序有,这是一个非推导上下文] 一个函数参数,其关联参数是一个初始化列表 (8.5.4),但该参数没有 std::initializer_list 或对可能有 cv 限定的 std::initializer_list 的引用类型。[示例:

模板无效 g(T);

g({1,2,3}); // 错误:没有为 T 推导出参数

—<em>结束示例]

我不知道或不理解的是为什么存在这种类型推断行为的差异。C++14 CD 中的规范与 C++11 中的规范相同,因此标准化委员会可能不会将 C++11 行为视为缺陷。

有谁知道为什么auto要为大括号初始化器推导出一个类型,但不允许模板这样做?虽然“这可能是原因”形式的推测性解释很有趣,但我对那些知道标准为何如此编写的人的解释特别感兴趣。

0 投票
1 回答
1718 浏览

c++ - 有没有办法推断出函数指针模板参数的值?

C++允许非类型模板参数为指针,包括函数指针、类型。我最近问了一个关于这有什么用的问题,这是对其中一个答案的跟进。

是否可以从作为相关函数指针的函数参数中推断出函数指针模板参数的值?例如:

有没有办法让这个扣除发生?从编译器实现者的角度来看,这在技术上似乎是可行的,只要函数参数可以在编译时解析为代码中的函数。

如果您想知道这背后的动机,请参阅此答案下的评论,特别是对std::bind().

编辑:我意识到我可以简单地删除函数参数并使用模板参数,如templ<func>(). 我添加函数参数的唯一目的是尽量避免传递模板参数。

我想我真正想要的是也推断出函数指针的类型,如:

然后就可以打电话了

或者

并从函数指针的一次提及中推断出类型和值。

希望现在更有意义。