在模板参数中使用 {} 在 type_trait{} 中时,其作用是什么<T>?
What is the role of the {} in type_trait<T>{} when used in a template parameter?
我经常在模板化代码中看到这种{}
的出现。我不确定我是否理解它在做什么。例如:
std::enable_if_t<std::is_copy_constructible<T&>{} && !std::is_same<T, MyClass>{}>>
这里{}
是什么?它是否实例化类型?作为模板参数,这意味着什么?
AFAIK 实例化类型意味着创建对象。如何在此上下文中创建对象?它只是创建一个虚拟对象吗?为什么要这样做呢?这有什么意义和目的?
在这种情况下,type_trait<T>{}
等同于type_trait<T>::value
。您的示例等效于以下内容:
std::enable_if_t<std::is_copy_constructible<T&>::value && !std::is_same<T, MyClass>::value>>
通常,使用type_trait<T>{}
而不是type_trait<T>::value
的一些好处是:
- C++17 增加了
type_trait_v<T>
.在C++17之前,type_trait<T>{}
同样简洁。 type_trait<T>{}
适用于标记调度。也就是说,foo(type_trait<T>{})
可以根据type_trait<T>::value
的值调用不同的重载,因为真值和假值是不同的类型。
这是有效的,因为类型特征继承自std::integral_constant<bool, Value>
,具有返回值的constexpr operator bool()
。因此,std::is_copy_constructible<T&>{}
产生一个类型为std::is_copy_constructible<T&>
的值,但由于我们在需要bool
的上下文中使用它,因此调用隐式转换运算符。
相关文章:
- "using namespace std;"在C++的作用是什么?
- 此代码中的" "是什么,它的基本作用是什么?
- 在模板参数中使用 {} 在 type_trait{} 中时,其作用是什么<T>?
- <<、>>算子在循环中的作用是什么
- 在c++中,减号和加号对字符串的作用是什么
- 窄集(_cast)的作用是什么
- 在这种情况下,#define 的作用是什么?
- 遍历模板参数包,没有争论的专业化的作用是什么?
- 在 c++ 中,没有 **std::fixed** 的 **std::setprecision()** 的作用是什么?
- 访问多个阵列时 CPU 缓存的作用是什么?
- 以下表达式的作用是什么:x = (a1,a2,..,n);
- 私人成员的作用是什么?
- 这段代码的作用是什么?
- *.exp文件的作用是什么
- ifstream::open()真正的作用是什么
- 如何在矩阵中使用指针.这行代码的作用是什么:int r=**(++b);
- 这个函数的作用是什么?与夹紧值有关
- 这个运算符()语法的作用是什么
- std::函数的模板参数中“const”修饰符和引用的作用是什么
- 字符串流在C++编程中的作用是什么