我想知道这个代码是否合法(当然是在C++17中):
template<typename T = int>
class C {};
int main() {
C c;
}
这在GCC 8.1.0中编译得很好,但Clang 6.0.0却失败了。我试图在“标准”中找到答案,但我不是语言律师,我也想不出答案。另一方面,声明如下:
std::less l; // same as std::less<void> l;
那么,是否可以定义一个对象,其类型是一个模板类,其中所有模板参数都有默认值,而不使用角括号。
编辑
我试图澄清我的疑问:我的代码,只
#include <typeinfo>
#include <iostream>
using namespace std;
template<typename T, typename U = T> void f1(T a, U b)
{
cout<<typeid(a).name()<<endl;
cout<<typeid(b).name()<<endl;
}
int main()
{
f1<float>(1,2);
}
输出
f->为什么int不像模板实例化那样默认浮动?
我正在尝试创建一个函数,它可以在满足给定条件的范围内找到最小元素:
#include <functional>
#include <iostream>
#include <vector>
template <typename It, typename Pred, typename Comp>
It minElementWhere(
It begin,
It end,
Pred pred = Pred(),
// Use less-than as the default comparator.
Comp
当我玩模板时,我注意到一个奇怪的模板演绎失败,我想知道为什么这应该逻辑上失败。请检查此代码:
template<typename T = int>
struct A {
T v;
};
int main()
{
A k;
static_assert(std::is_same_v<decltype(k.v), int>);
}
此代码编译时没有任何问题,k.v将具有int类型,因为它被定义为模板参数的默认类型。下面的代码是:
template<typename T = int>
struct A {
T v;
};
stru
前言:我知道我可以通过重载或者在模板中使用多个类型名来完成这个任务。我只是想了解模板是如何工作的,并想了解我所看到的。
请考虑这个模板,它故意假定所有的args都是相同类型的,只是为了提供一个示例:
template <typename T>
inline T saturate(T val, T lower, T upper)
{
T val1 = val > lower ? val : lower;
T val2 = val1 < upper ? val1 : upper;
return val2;
}
int main()
{
double v
在所有参数都是默认的情况下,我试图理解函数模板参数推导的规则。在13.10.1 (显式模板参数规范)下,标准(C++20)说:
-当一个函数的地址被取下来,当一个函数初始化了对函数的引用,或者当一个指向成员函数的指针被形成时,.如果可以推导出所有的模板参数,那么它们都可以被省略;在这种情况下,空模板参数列表<>本身也可能被省略。
然而,在下面代码片段的第四行中,编译器(gcc、MSVC)似乎坚持使用空的尖括号。这是不符合规定还是我漏掉了什么?(在本例中,这个问题并不重要,但问题出现在它确实重要的上下文中)。
template <typename T = int> voi
C++14标准为std::exchange指定了以下声明
template <class T, class U = T>
T std::exchange(T& obj, U&& new_value);
我想知道为什么U默认为T,因为由于new_value可以找到U。在这种情况下,这将导致与以下结果不同的结果:
template <class T, class U>
T std::exchange(T& obj, U&& new_value);
以下C++20程序: #include
#include
template
class C {
template
static void call(
std::index_sequence = std::index_sequence_for{}
) {}
};
int main() {
C::call();
} 编译失败,并显示错误消息: test.cc: In static member function ‘static void C::call(std::index_sequence) [with long unsigned int .
这对C++14无效吗?
auto f = [](auto x, auto y = std::decay_t<decltype(x)>{}) { };
f(0);
我以为这大致相当于
auto f = [](int x, int y) { };
f(0, int{});
GCC 6.3和Clang 4.0都不接受我的代码。
GCC
族
这与我对C++模板演绎阶段的缺乏了解有关吗?1400页长的规范实际上对我的问题有明确的答案吗?
更新
总之,我的问题实际上可以归结为这段代码(没有lambda,单个参数),并且在C++14下是无效的(谢谢@BaummitAugen和@
我有以下代码:
class A {
public:
A(std::vector<std::shared_ptr<int>>){}
};
auto x = std::make_shared<int>(0);
auto y = std::make_shared<int>(1);
auto list = {x, y};
auto res = std::make_shared<A>({x, y});
在这个示例中,如果我传递给res变量列表,它会编译,否则,