下面的代码中,为什么POD被认为是POD,而notPOD被认为不是POD呢?它们之间的唯一区别是默认构造函数的定义是放在类内部还是外部。我一直认为两者做同样的事情,但事实显然并非如此。
#include <iostream>
struct POD {
POD() = default;
};
struct notPOD {
notPOD();
};
notPOD::notPOD() = default;
int main() {
std::cout << std::boolalpha << std::is_pod<POD>() << ' ' << std::is_pod<notPOD>() << '\n';
}
Run Code Online (Sandbox Code Playgroud) int main() {
std::cout << 1, std::cout << 2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码片段在语法上是正确的,因为逗号可用于分隔语句。然而,
int main() {
int a, std::string b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这会返回一个错误
'b' 之前的预期初始化程序
为什么是这样?在某些情况下我不能使用逗号分隔语句吗?例如在这种情况下定义变量?
在以下示例中:
template<typename T>
struct MyList {
typedef std::list<T> type1;
};
template<typename T>
class MyList2 {
typename MyList<T>::type1 type2;
};
Run Code Online (Sandbox Code Playgroud)
我认为 type1 和 type2 都是依赖名称,因为它们的类型都依赖于模板参数。但是,为什么第一个被认为是非依赖的,因为我可以使用typedef
它?
class Base {
};
class Derived: private Base {
};
int main() {
Derived d;
static_cast<Base>(d);
}
Run Code Online (Sandbox Code Playgroud)
我知道由于私有继承,这样的强制转换是一个错误。然而,我感兴趣的是为什么错误消息是:
error: cannot cast 'const Derived' to its private base class 'const Base'
Run Code Online (Sandbox Code Playgroud)
特别是,为什么它不将“Derived”转换为“Base”?为什么这里有一个const?提前致谢。