标签: nullptr

从nullptr推导出的指向模板类型?

考虑到功能:

template <class T> void f(const T* const ptr);
Run Code Online (Sandbox Code Playgroud)

什么是Tf(nullptr)

c++ templates nullptr c++11

5
推荐指数
1
解决办法
186
查看次数

由nullptr初始化的C++ 11自动变量

C++ 11标准初始化的变量"某事"的类型是什么

auto something = nullptr;
Run Code Online (Sandbox Code Playgroud)

c++ nullptr auto c++11

5
推荐指数
1
解决办法
1896
查看次数

C++ nullptrt_t作为构造函数中的参数

阅读一些代码我发现一个类只接受新的C++ 11 nullptr_t作为参数.该课程如下所示.

我是否纠正了我唯一可以通过专门使用构造对象的东西nullptr

class CA {
 public:
 CA(nullptr_t) {}  
};
Run Code Online (Sandbox Code Playgroud)

nullptr c++11

5
推荐指数
2
解决办法
555
查看次数

为nullptr提供模板推导的类型

假设以下代码段:

template <class T>
void fct(T* a, T* b){
  // do something
}

A a;
fct(&a, nullptr); // Problem here!
Run Code Online (Sandbox Code Playgroud)

这使得麻烦,因为调用参数的数据类型的A*,并nullptr_t因此编译器不能推断出模板参数T.

一般来说,我可以想象几个想法如何解决这个问题:

  • 定义A* b = nullptr和使用fct(&a, b)
  • fct为一个nullptr案例定义一个带有一个参数的重载
  • 使用 fct(&a, static_cast<A*>(nullptr))

或者是否有更清晰的解决方案,比如创建类似"typed nullptr"的东西?

c++ templates nullptr

5
推荐指数
2
解决办法
696
查看次数

C++:设置指向 nullptr 的指针与将其初始化为新变量类型之间的区别

我正在学习 C++,我知道“new”关键字用于将内存中的地址分配给指针。我认为当使用“nullptr”时会初始化一个指向任何内容的指针。那是对的吗?参考示例:

//using nullptr
int *x = nullptr; //this is just a pointer that points to nothing and
                  //will need to be initialized with an address before it  
                  //it can be used. Correct?

//using new
int *x = new int; //this is basically giving x an address in memory. Will the 
                  //address have some residual value stored in it or will
                  //it contain zero?
Run Code Online (Sandbox Code Playgroud)

你什么时候会使用其中一种而不是另一种?new 仅用于动态内存分配还是还有其他应用?如果你可以先声明一个指向 nullptr 的指针,然后再初始化它,为什么还要初始化它呢?

谢谢您的帮助!

c++ pointers new-operator nullptr

5
推荐指数
2
解决办法
2万
查看次数

c ++ - 为什么nullptr_t不能赋值给int*?

cout << std::is_assignable<int*, std::nullptr_t>::value << endl;
cout << std::is_assignable<int*&, std::nullptr_t>::value << endl;
Run Code Online (Sandbox Code Playgroud)

输出为:0 1

我不明白为什么第一次检查返回false

我可以将nullptr分配给对指针引用,但是我不能将它分配给原始指针

这是相反的!

int* p = nullptr;
int*& pref = nullptr;
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,第二个赋值标记了一个错误:

错误:不能非const结合左值参考类型的INT*右值类型的INT*

有人可以解释一下发生了什么吗?

c++ templates type-traits nullptr

5
推荐指数
1
解决办法
378
查看次数

const std :: string&s = nullptr如何作为可选参数

据我所知,引用不能为空,但是当我运行这样的代码时:

#include <iostream>
#include <string>

void test(int i, const std::string& s = nullptr) {
  std::cout << i << " " << s << std::endl;
}

int main() {
  test(1, "test");
  test(2);
}
Run Code Online (Sandbox Code Playgroud)

可选参数s可以为null,并生成代码。此外,test(2)运行时,程序将引发异常,而不是打印一些随机字符串。

当我更改s为int之类的基本类型时,它无法编译,因此我认为魔术仍然保留在字符串类中,但是如何?

而且,如何检查是否s为null?如果我使用if(s==nullptr)if(s.empty()),它将无法编译。

c++ reference initializer stdstring nullptr

5
推荐指数
1
解决办法
214
查看次数

如果make_shared / make_unique可以抛出bad_alloc,为什么不尝试使用try catch块呢?

make_shared的CppReference页面说(与make_unique相同)

可能引发std :: bad_alloc或T的构造函数引发的任何异常。如果引发异常,则这些函数无效。

这意味着在失败的情况下可以引发std :: bad_alloc接收。“函数无效”暗含意味着它无法返回nullptr。如果是这种情况,为什么不总是将make_shared / make_unique始终写入try catch块中是一种惯例?

使用make_shared的正确方法是什么?在尝试捕获块内?或检查nullptr?

c++ exception smart-pointers nullptr c++11

5
推荐指数
1
解决办法
209
查看次数

将三路比较运算符的结果与 nullptr 进行比较有什么作用?

鉴于cppreference on<=>的示例,我们可以将示例代码简化为:

struct person {
    std::string name;
    std::string surname;

    auto operator <=> (const person& p) const {
        if (const auto result = name <=> p.name; result != 0) {
            return result;
        } else {
            return surname <=> p.surname;
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

但是我的 IDE(CLion 2020.2)通过 clang-tidy 警告result != 0实际上应该是result != nullptr. 我不知道我们可以std::###_orderingnullptr. Cpprefence 还声称我们应该将它与literal 进行比较0。那里什么都nullptr没有。

这段代码:

int main() {
    person p1{"ccc", "vvv"};
    person p2{"aaa", "zzz"}; …
Run Code Online (Sandbox Code Playgroud)

c++ nullptr spaceship-operator c++20

5
推荐指数
1
解决办法
193
查看次数

将 nullptr 转换为 std::span

我有一个const z* zs = nullptr;

\n

我想转换zsstd::span

\n

当我尝试这样做时,std::span<const z>(zs) 我收到一条错误消息

\n
\n

错误:没有匹配的函数可调用 \xe2\x80\x98std::span::span(const z* const&)\xe2\x80\x99

\n
\n

如何转换为 zsstd::span

\n

我试过std::span<const z>(zs[0])了,好像可以编译。这种方式正确吗?

\n

c++ nullptr std-span

5
推荐指数
2
解决办法
1319
查看次数