相关疑难解决方法(0)

nullptr或nullptr

如果我说的nullptr,是正确的术语 nullptr(只有一个,并且所有提及是同一事物的引用),或一个 nullptr(有几个相同的东西).

也就是说,应该是功能文档说

如果是ptrnullptr,则该函数使用内部缓冲区...

要么

如果ptr是a nullptr,则该函数使用内部缓冲区...

(讽刺的是,这不是一个基于意见的问题,因为它可以通过参考究竟 nullptr是什么来回答)

c++ null language-lawyer

15
推荐指数
2
解决办法
1546
查看次数

如何用文字0和指针解决对重载函数的调用歧义

我很确定这一定已经在这里了,但是我没有找到很多关于如何解决这类问题的信息(没有在电话上强制转换):

给定两个重载,我希望一个带有文字0的函数的调用总是调用unsigned int版本:

void func( unsigned int ) {
    cout << "unsigned int" << endl;
}

void func( void * ) {
    cout << "void *" << endl;
}

func( 0 ); // error: ambiguous call
Run Code Online (Sandbox Code Playgroud)

我明白为什么会这样,但我不想一直写func(0u)甚至func(static_cast(0)).所以我的问题是:

1)是否有推荐的方法来执行此操作?

2)以下方式进行操作是否有任何问题,这是什么原因?

void func( unsigned int ) {
    cout << "unsigned int" << endl;
}

template <typename T>
void func( T * ) {
    static_assert( std::is_same<T, void>::value, "only void pointers allowed" );
    cout << "void *" << endl;
}

func( 0 ); // …
Run Code Online (Sandbox Code Playgroud)

c++ templates overloading overload-resolution

10
推荐指数
1
解决办法
6546
查看次数

新C++是否向后兼容

我多年没用C++编写代码了.我最近发现,在那些年里它发生了巨大变化.我不确定我是否喜欢这些变化,但这是另一个讨论.

我仍然有一些C++代码敲我的硬盘.如果我把它拿出来并尝试用一个不错的新C++编译器编译它,比如说最新版本的g ++,它会编译吗?没有警告(假设它之前没有警告编译)?

最近我确实搞乱了一些VC++ 2010,并发现了一些我期望工作的东西不起作用,并且当我尝试使用NULL时根据上下文得到不同的消息.但是在该代码的一部分中,我使用NULL甚至没有警告.

c++

9
推荐指数
4
解决办法
3575
查看次数

"backporting"nullptr到C++ - 前C++ 0x程序

或多或少的标题暗示.虽然我还没有使用C++ 0x,但是我想在它发生时做好准备,而且我还想减少我必须重写的代码量才能使用它的一些功能.这样我就可以一次性地向前和向后兼容.

我发现的最有趣的一个是nullptr,我最近经常使用它.

在检查了"官方解决方法"和Meyer的建议之后,我决定在我的C++和未来的C++ 0x程序中使用它.第二部分很简单 - 作为关键字,nullptr只需支持.但第一部分让我感到有些不适.

Meyers提案的功能如下:

class nullptr_t { // ? this is my issue
    // definition of nullptr_t
} nullptr = { };
Run Code Online (Sandbox Code Playgroud)

该提议的问题在于它声明了要声明为std::nullptr_tC++ 0x所需的类型.这意味着对于"感觉原生"的解决方法,必须通过重新打开std::命名空间来添加类型.我理解在C++程序中这是非法的(不像添加特殊化,这显然是皱眉和放开警告).

我想用nullptr在舒适在C++程序合法的方式.我想到的一个选项是在另一个命名空间中声明类型然后使用它using:

namespace mylibrary {
class nullptr_t {
    ....
} nullptr = { };
// end namespace
}

// These would have to go in the header file.
using mylibrary::nullptr;
using …
Run Code Online (Sandbox Code Playgroud)

c++ backport nullptr forward-compatibility c++03

9
推荐指数
1
解决办法
3834
查看次数

if(NULL ==指针)和if(指针== NULL)之间有什么区别?

使用有什么区别:

if (NULL == pointer) 
Run Code Online (Sandbox Code Playgroud)

和使用:

if (pointer == NULL)    
Run Code Online (Sandbox Code Playgroud)

我的教授说使用前者而不是后者,但我看不出两者之间的区别.

c++ coding-style conditional-statements

8
推荐指数
2
解决办法
1208
查看次数

什么是引用指针?

我最近看到一个被声明为的函数:

void func(type* &param);
Run Code Online (Sandbox Code Playgroud)

我已经知道之间的区别type* paramtype& param.以上与他们有何不同?什么时候使用这个?这样做是否明智?

c++ parameter-passing

8
推荐指数
1
解决办法
1209
查看次数

模糊调用重载函数

我有两个功能:

void DoSomething( const tchar* apsValue )
void DoSomething( size_t aiValue )
Run Code Online (Sandbox Code Playgroud)

现在我想传递'0'作为size_t:

DoSomething(0);
Run Code Online (Sandbox Code Playgroud)

编译器抛出一个错误:"对重载函数的模糊调用"

要解决这个问题,我可以使用static_cast,例如:

DoSomething(static_cast<size_t>(0));
Run Code Online (Sandbox Code Playgroud)

或者简单:

DoSomething(size_t(0));
Run Code Online (Sandbox Code Playgroud)

其中一个比另一个好吗?有没有其他方法可以解决这个问题?

c++ overloading static-cast

7
推荐指数
1
解决办法
4470
查看次数

删除动态分配的变量设置指针为0

我无法理解这段代码的结尾(array = 0;):

#include <iostream>

int main()
{
    std::cout << "Enter a positive integer: ";
    int length;
    std::cin >> length;

    int *array = new int[length];

    std::cout << "I just allocated an array of integers of length " << length << '\n';

    array[0] = 5; // set element 0 to value 5

    delete[] array; // use array delete to deallocate array
    array = 0; // use nullptr instead of 0 in C++11

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

最后,删除动态分配的数组(返回到OS),然后分配值0.

为什么这样做?数组返回操作系统后,无需为其赋值0,对吗?

代码来自:http …

c++ arrays pointers memory-management dynamic-allocation

7
推荐指数
2
解决办法
1275
查看次数

在API函数调用中使用nullptr?

在Visual Studio 2010中使用C++.我正在将我的转换NULLnullptr.用我的代码这很好.但是如果我打电话给WINAPI,例如:

__checkReturn WINOLEAPI OleInitialize(IN LPVOID pvReserved);
Run Code Online (Sandbox Code Playgroud)

通常我会称之为:

::OleInitialize(NULL);
Run Code Online (Sandbox Code Playgroud)

我可以安全地使用nullptrNULL在这样的电话中使用的地方吗?

也就是说,我可以这样做:

::OleInitialize(nullptr);
Run Code Online (Sandbox Code Playgroud)

与MFC api一样:

CFileDialog fileDlg(TRUE, ".txt", NULL, 0, strFilter);
Run Code Online (Sandbox Code Playgroud)

我可以更换吗?

CFileDialog fileDlg(TRUE, ".txt", nullptr, 0, strFilter);
Run Code Online (Sandbox Code Playgroud)

我猜我可以,但我只是想确保没有陷阱.

UPDATE

所以我通过nullptr替换了我的所有NULL,它似乎在所有地方工作,但是我在下面的行中得到以下错误:

propertyItem = new CMFCPropertyGridProperty(_T("SomeName"),
"SomeValue", "SomeDescription", nullptr, nullptr, nullptr, nullptr);
Run Code Online (Sandbox Code Playgroud)

8> c:\ something\something.cpp(118):错误C2664:'CMFCPropertyGridProperty :: CMFCPropertyGridProperty(const CString&,const COleVariant&,LPCTSTR,DWORD_PTR,LPCTSTR,LPCTSTR,LPCTSTR)':无法从'nullptr转换参数4 'to'DWORD_PTR'8>本机nullptr只能转换为bool,或者使用reinterpret_cast转换为整数类型

(注意CMFCPropertyGridProperty是Microsoft MFC类)那么这是什么意思?

c++ null winapi mfc nullptr

6
推荐指数
1
解决办法
2401
查看次数

如果 php 自动为您初始化类内的属性,是否需要将其初始化为 null?

对两个类中的一个对象执行 var_dump 会得到相同的结果

Class Node{
    public $parent = null;
    public $right = null;
    public $left = null;        
    function __construct($data){
        $this->data = $data;                    
    }
}

Class Node{
    public $parent;
    public $right;
    public $left;        
    function __construct($data){
        $this->data = $data;                    
    }
}
Run Code Online (Sandbox Code Playgroud)

例如

$a = new Node(2);
var_dump($a);
Run Code Online (Sandbox Code Playgroud)

对于上述任一类返回以下内容

object(Node)#1 (4) {
  ["parent"]=>
  NULL
  ["right"]=>
  NULL
  ["left"]=>
  NULL
  ["data"]=>
  int(2)
}
Run Code Online (Sandbox Code Playgroud)

对于变量来说,情况似乎并非如此。

$b;
var_dump($b);
Run Code Online (Sandbox Code Playgroud)

如果您打算将该属性的值设置为 ,null是否需要明确编写该值,因为 php 似乎会自动为您执行此操作?

另外 - 根据这个答案/sf/answers/422316331/,如果您尝试获取未初始化变量的值,C++ 会给出未定义的行为。如果类中的属性未初始化为值null,C++ 是否会像 php 那样自动设置该属性的值?

php

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