相关疑难解决方法(0)

什么是神奇的数字,为什么它不好?

什么是神奇的数字?

为什么要避免?

有适合的情况吗?

language-agnostic magic-numbers

489
推荐指数
10
解决办法
24万
查看次数

nullptr虚假吗?

当用作布尔表达式或显式或隐式转换为布尔值时,是否nullptr始终为假?该实现是否在标准中定义或指定?

我编写了一些代码进行测试,但不确定是否可以完全测试此属性。我找不到一个专门讨论此问题的现有SO答案。从我所见,cppreference并没有提到这一点。

if (nullptr) {
    ;
} else {
    std::cout << "Evaluates to false implicitly\n";
}

if (!nullptr) {
    std::cout << "Evaluates to false if operated on\n";
}

if (!(bool)(nullptr)) {
    std::cout << "Evaluates to false if explicitly cast to bool\n";
}
Run Code Online (Sandbox Code Playgroud)

预期和实际:

Evaluates to false implicitly
Evaluates to false if operated on
Evaluates to false if explicitly cast to bool
Run Code Online (Sandbox Code Playgroud)

c++ nullptr implicit-conversion c++11

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

为什么我会收到 Wsign 转换警告?

我有以下代码:

template <typename T>
struct wrapper {
    T t;
    operator T() { return t; }
    T get() { return t; }
};

int main() {
    int a[10];
    int* x = a;
    wrapper<long unsigned int> y{2};
    std::cout << (x + y); // warning
}
Run Code Online (Sandbox Code Playgroud)

当我在 gcc 上编译它(在 7.3.0 和 8.2.0 上测试)时,-Wsign-conversion我收到“警告:从‘long unsigned int’转换为‘long int’可能会改变结果的符号”。如果y有 type long unsigned int,则没有警告。此外,当我明确调用时y.get()也没有警告:

std::cout << (x + y.get()); // this is ok
Run Code Online (Sandbox Code Playgroud)

为什么会出现这种情况呢?使用用户定义的转换时,是否有一些不能使用的指针算术特殊规则?

c++ gcc type-conversion implicit-conversion c++11

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