默认情况下初始化模板中的指针
Default initializing a pointer in a template
在下面的代码中,Get()
返回模板类型的默认值。我想知道为什么以及如何正确/定义指针类型
#include <iostream>
#include <string>
template <typename ValueType>
inline ValueType Get()
{
return ValueType();
}
int main()
{
int* IntPtr = Get<int*>();
//int* IntPtr2 = (int*)(); // Invalid
//int* IntPtr3 = (int*){}; // Valid
std::cout << (IntPtr == nullptr ? "nullptr" : "non-nullptr") << std::endl;
std::cin.get();
return 0;
}
当编译器在Get
中计算ValueType()
时,我本以为它会变成(int*)()
,但由于这是无效的,它会被区别对待吗?
当编译器在
Get
中评估ValueType()
时,我本以为它会变成(int*)()
,但由于这是无效的,它会被区别对待吗
C++模板虽然与宏非常相似,但不执行文字替换。ValueType
仍然是模板范围内的实际类型。因此,是的,return ValueType()
将与(int*)()
不同,更像using ValueType = int*; return ValueType();
为什么using ValueType = int*; ValueType();
工作而(int*)()
不工作:
在C++中,形式为T()
的表达式(当T
是类型时(是值初始化语法,该语法创建类型为T
的无名称对象。
在值初始化期间,非类类型被初始化为零。
问题是(int*)()
的形式不是T()
,而是(T)()
。(int*)()
被解析为int*
的强制转换,但它缺少要强制转换的值。这正是编译器在错误中所说的:
<source>:2:27: error: expected expression
int* IntPtr2 = (int*)();
^
出于同样的原因,using T = int; int x = (T)();
也不会编译。
类似地,int* IntPtr3 = (int*){};
也是无效的C++(GCC编译它,但例如MSVC不会编译(。
一些可能的解决方案:
typedef
是指向某种类型的指针,那么您将能够正常使用T()
形式:using T = int*; T ptr = T();
使用复制列表初始化语法:
int* ptr = {};
使用直接列表初始化语法:
int* ptr{};
请注意,直接初始化形式int* ptr();
也不可用,因为它会受到最麻烦的解析。
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 在这种情况下,当尝试从单独的类更新变量时,我是否需要使用指针?
- 我们可以在不使用head指针的情况下通过使用head的简单变量而不是head的指针来实现链表吗
- 在不工作的情况下为数组分配指针,但反过来也可以
- 对于多态类型T,如何在没有类型T实例的情况下获得指向T的虚拟表的指针
- 为什么不能指向指针,在没有强制转换的情况下访问结构成员?
- 有没有办法在没有reinterpret_cast的情况下保存多种类型的指针?
- (C++)如何在不导致 mem 泄漏的情况下将指针传递到分配了'new'的函数?
- C++:为什么可以在没有事先使用 new 的情况下在指向结构的指针上使用 delete?
- 在C++我可以在不在本地声明结构的情况下将结构作为指针传递吗?