小编ala*_*ain的帖子

抛出临时而不是局部变量 - 为什么?

有问题的代码是这样的:

struct something_bad_happened_exception : std::exception {};

void foo() {
    something_bad_happened_exception e;
    throw e;
}
Run Code Online (Sandbox Code Playgroud)

clang发出警告:

抛出表达式应该抛出匿名临时值而不是[cert-err09-cpp]

这意味着foo()应该改为:

void foo() {
    throw something_bad_happened_exception();
}
Run Code Online (Sandbox Code Playgroud)

为什么抛出临时变量而不是局部变量更好?

c++

19
推荐指数
2
解决办法
661
查看次数

MSVC与GCC的行为不一致的sizeof

请考虑以下代码:

#include <cstddef>

class A
{
public:
    struct B
    {
        int M;
    };

    static void StaticFunc();
};

void A::StaticFunc()
{
    const std::size_t s0 = sizeof(::A::B::M);
    const std::size_t s1 = sizeof(A::B::M);
    const std::size_t s2 = sizeof(B::M);
}

int main()
{
    const std::size_t s3 = sizeof(A::B::M);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

GCC编译它,只是警告未使用的变量.

但是,Visual C++ 2015无法使用以下代码编译它:

error C2326: 'void A::StaticFunc(void)': function cannot access 'A::B::M'
Run Code Online (Sandbox Code Playgroud)

就行了

const std::size_t s0 = sizeof(::A::B::M);
const std::size_t s1 = sizeof(A::B::M);
Run Code Online (Sandbox Code Playgroud)

StaticFunc().

其他的线s2 = ...,并s3 …

c++ visual-c++ compiler-bug visual-c++-2015

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

隐式转换如何在C++中工作

我想弄清楚隐式转换是如何工作的.
我有3个功能

Foo(int, int)
Foo(short, short)
Foo(short, unsigned char)
Run Code Online (Sandbox Code Playgroud)

然后我打电话

Foo(unsigned char, unsigned char)
Run Code Online (Sandbox Code Playgroud)

并被Foo(int, int)称为.有人可以解释它是如何工作的吗?

c++

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

类定义后是否允许类声明?

我刚读完这个答案,这让我很困惑.

我总是认为类声明可以出现很多次,只有定义只能存在一次,如:

/*class Class {*/

    class A;         // (1) forward declaration

    class A {        // (2) definition, only once
       int m;
    };

    class A;         // (3) declaration again, legal?

    class A a;       // (4) declaration again, legal?

/*};*/
Run Code Online (Sandbox Code Playgroud)

从链接的答案:(3)(α和(4)),如果上面的代码是非法的嵌套类内部(定义和声明class A嵌套内部class Class).

cppreference上,我发现了上面的一个例子,而不是嵌套的:

struct s { int a; };
struct s; // does nothing (s already defined in this scope)
void g() {
    struct s; // forward declaration of …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer

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

未知的类型名称C.

我知道在使用它们之前必须先定义它们,但是我得到了一个"未知类型名称错误".

这是我的Node定义:

struct Node  {
    position* p;
    struct Node* next;
    struct Node* prev;
};
Run Code Online (Sandbox Code Playgroud)

这是我的声明(第96行):

Node* hashtable[HashArraySize];
Run Code Online (Sandbox Code Playgroud)

我收到此错误消息:

P1.c:96:1: error: unknown type name ‘Node’
 Node* hashtable[HashArraySize];
Run Code Online (Sandbox Code Playgroud)

c

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

使用未定义的行为是否未定义编译器的行为?

当我回答这个问题时,我写道:

首先,需要注意的是,不仅未定义用户程序的行为,而且未定义编译器的行为.

但是评论中存在分歧,所以我想在这里提出这个问题:

如果源代码包含未定义的行为,是否只是未定义的已翻译机器代码的行为,或者编译器的行为是否也未定义?

该标准定义了抽象机器的行为(1.9):

本国际标准中的语义描述定义了参数化的非确定性抽象机器.本国际标准对符合实施的结构没有要求.特别是,它们不需要复制或模拟抽象机器的结构.相反,需要符合实现来模拟(仅)抽象机器的可观察行为,如下所述.

也许问题是编译器是否是该机器的一部分,如果是,是否允许该部件以未定义的方式运行?


这个问题的一个更实际的版本是:
假设编译器在所有控制路径上找到UB时会崩溃或不产生任何输出,就像在这个程序中一样:

int main() {
    complex_things_without_UB();
    int x = 42;
    x = x++;  //UB here
    return x;
}
Run Code Online (Sandbox Code Playgroud)

但否则它将始终产生正确的二进制文件.这仍然是符合标准的编译器吗?

c++ undefined-behavior language-lawyer

4
推荐指数
1
解决办法
323
查看次数

检查两个(智能)指针是否指向同一派生类

比方说,我有一个基础抽象类B百余类,从它派生D1... D100.我也有两个(智能)指针unique_ptr<B> p1, p2;,其指向的类型的两个不同的实例DiDj.我想知道他们指向的对象是否具有相同的类型(即是否i等于j).有一个简单的方法吗?

c++ c++11

3
推荐指数
2
解决办法
620
查看次数

在C中分配大数字加倍

当我尝试为double变量分配一个大数字时,我收到此警告

sqrt.c:8:11:警告:整型常量对于它的类型来说太大了
x = 28462391747582051264412870770688;

#include <stdio.h>
#include <math.h>
#include <limits.h>
#include <float.h>

int main() {
        printf("MAX_DBL=%.53f\n",DBL_MAX);
        double x=28462391747582051264412870770688; 
}
Run Code Online (Sandbox Code Playgroud)

但是,MAX_DBL大于我尝试分配的数字.

c double

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