有问题的代码是这样的:
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)
为什么抛出临时变量而不是局部变量更好?
请考虑以下代码:
#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 …
我想弄清楚隐式转换是如何工作的.
我有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)称为.有人可以解释它是如何工作的吗?
我刚读完这个答案,这让我很困惑.
我总是认为类声明可以出现很多次,只有定义只能存在一次,如:
/*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上,我发现了上面的一个例子,而不是嵌套的:
Run Code Online (Sandbox Code Playgroud)struct s { int a; }; struct s; // does nothing (s already defined in this scope) void g() { struct s; // forward declaration of …
我知道在使用它们之前必须先定义它们,但是我得到了一个"未知类型名称错误".
这是我的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) 首先,需要注意的是,不仅未定义用户程序的行为,而且未定义编译器的行为.
如果源代码包含未定义的行为,是否只是未定义的已翻译机器代码的行为,或者编译器的行为是否也未定义?
该标准定义了抽象机器的行为(1.9):
本国际标准中的语义描述定义了参数化的非确定性抽象机器.本国际标准对符合实施的结构没有要求.特别是,它们不需要复制或模拟抽象机器的结构.相反,需要符合实现来模拟(仅)抽象机器的可观察行为,如下所述.
也许问题是编译器是否是该机器的一部分,如果是,是否允许该部件以未定义的方式运行?
这个问题的一个更实际的版本是:
假设编译器在所有控制路径上找到UB时会崩溃或不产生任何输出,就像在这个程序中一样:
int main() {
complex_things_without_UB();
int x = 42;
x = x++; //UB here
return x;
}
Run Code Online (Sandbox Code Playgroud)
但否则它将始终产生正确的二进制文件.这仍然是符合标准的编译器吗?
比方说,我有一个基础抽象类B百余类,从它派生D1... D100.我也有两个(智能)指针unique_ptr<B> p1, p2;,其指向的类型的两个不同的实例Di和Dj.我想知道他们指向的对象是否具有相同的类型(即是否i等于j).有一个简单的方法吗?
当我尝试为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大于我尝试分配的数字.