gpt4 book ai didi

c++ - 默认初始化模板中的指针

转载 作者:行者123 更新时间:2023-12-03 06:54:28 24 4
gpt4 key购买 nike

在下面的代码中,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*)(),但是因为这是无效的,是否区别对待?

最佳答案

When the compiler evaluates ValueType() in Get, I would have expected it to become (int*)(), but since this is invalid, is it treated differently?

C++ 模板虽然与宏非常相似,但不执行文字替换。 ValueType 仍然是模板范围内的实际类型。所以是的,return ValueType() 的处理方式与 (int*)() 不同,更像是 using ValueType = int*;返回 ValueType();

至于为什么 using ValueType = int*; ValueType();(int*)() 不工作时工作:

在 C++ 中,T() 形式的表达式(当 T 是类型时)是 value-initialization创建类型为 T 的无名对象的语法。

值初始化期间,非类类型是zero-initialized .

问题是 (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 不会)。

一些可能的解决方法:

  1. typedef 指向某种类型的指针,然后您就可以正常使用 T() 形式:

     using T = int*;
    T ptr = T();
  2. 使用复制列表初始化语法:

     int* ptr = {};
  3. 使用直接列表初始化语法:

     int* ptr{};

请注意,直接初始化形式 int* ptr(); 也是不可用的,因为它会受到最令人烦恼的解析。

关于c++ - 默认初始化模板中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64060572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com