14得票2回答
为什么在GCC中,对于std::set而言,扣除操作失败?

我有一个std::set,它允许从迭代器范围中推断。 Translated: 我有一个std::set,可以从迭代器范围进行推断。#include <iostream> #include <set> int main() { std::set s1 = {1...

14得票2回答
C++17中类模板的参数推导会因构造函数模板引起歧义吗?

考虑一个简单的例子: template <class T> struct foo { template <template <class> class TT> foo(TT<T>&&) {} foo(fo...

14得票2回答
如何更好地禁用特定函数参数的模板参数推导?

这是我想要做的事情: template <typename T> void f(DisableDeduction<T> obj) {std::cout << obj;} // Here DisableDeduction<T> aliases T...

14得票1回答
涉及非推导参数包的函数指针参数类型的模板参数推导

这类似于这个问题,但更具体。这次,没有编译器按预期工作。 template<class T> struct nondeduced { using type = T; }; template<class T> using nondeduced_t = type...

14得票4回答
为什么C++17标准没有引入部分类模板参数推导?

我希望我能够在构建std::set/ std::map或任何其他使用自定义比较器的容器时,利用新的模板参数推导功能。我的目标是创建一个一行代码的语句,它将创建一个具有lambda比较器的高效集合。 自C++11以来我可以做到的是:std::set<int, std::function&...

14得票2回答
模板函数类型推导和operator<<

当我使用MSVC++编译以下代码时,会出现错误: struct A { template&lt;typename T&gt; void operator&lt;&lt;(T&amp;&amp; x) { } }; void f() { } int main(...

14得票1回答
理解SFINAE

据我所知,SFINAE意味着替换失败不会导致编译错误,而只是从可能的重载列表中删除原型。但我不明白为什么这是SFINAE。 template &lt;bool C, typename T = void&gt; struct enable_if{}; template &lt;typename...

14得票3回答
带有空尖括号<>的模板函数调用

我对下面的模板行为感到困惑,因为它在空的尖括号中编译正常(没有参数的模板),由于语法上,template&lt;&gt;保留用于标记显式模板特化。 template &lt;typename T&gt; void add(T a, T b) { } int main() { add&...

14得票1回答
C++20指定初始化器与模板类型

指定初始化器(C++20)如何与CTAD配合使用? 这段代码在gcc9.2中可以正常工作,但在clang8中失败了。template &lt;typename int_t=int, typename float_t=float&gt; struct my_pair { int_t ...

14得票4回答
使用可变模板的隐式转换

考虑两个函数调用foo({"a", 1}, {"b", "value"}); foo({"a", 1}, {"b", "value"}, {"c", 1.0}); 有没有一种方法可以编写一个函数 foo,用于任意数量的参数对? 我在考虑以下方式:template &lt;typename.....