std::is_pod vs subclassing
std::is_pod vs subclassing
有人可以帮助我理解为什么以下代码无法编译(g ++ 4.8)。我的理解是可以初始化 POD
#include <iostream>
#include <type_traits>
struct my_int
{
int val_;
};
struct B : public my_int
{
};
int main()
{
std::cout << std::is_pod<my_int>::value << std::endl;
std::cout << std::is_pod<B>::value << std::endl;
const my_int v = { 123 };
//const B v2 = { 123 }; // does not compile with g++ 4.8.
return 0;
}
编译是:
g++ -std=c++11 t.cxx
t.cxx: In function 'int main()':
t.cxx:24:21: error: could not convert '{123}' from '<brace-enclosed initializer list>' to 'const B'
const B v = { 123 };
^
编辑:
感谢大家的回答,我现在理解了聚合初始化的概念。我错过了聚合不能有基类的事实。因此,我目前的实施计划需要改变。我想做这样的事情:
template < typename T >
struct base_class
{
int val_;
};
struct MyInt : public base_class<int>
{
void Func1() {}
};
struct MyDouble : public base_class<double>
{
void Func2() {}
};
我将重新设计上面的代码,以避免使用子类引入特殊成员函数,同时避免代码重复。
免责声明
对以下内容持保留态度,因为这是我对事物的解释。我绝不是专家。(我也对我在这里提到的聚合 - 初始值设定项列表关系有一些疑问。
答
据我所知,这是不可能的,因为 v2 的聚合初始化将应用于非聚合类类型 B。
从这个答案中你可以认为聚合不能有基类,这使得B
成为非聚合,因此不能通过大括号括起来的初始值设定项列表进行初始化
另一方面,std::is_pod
可能不会按照您认为的方式进行操作,因为 POD 定义已在 C++11 中更改。因此,它不会提示您是否可以使用此类聚合初始值设定项初始化 POD 类型。
加法
我在这里主要讨论聚合初始化,但更通用的术语是列表初始化,其限制较少。但是,检查我在链接资源中找到的所有情况,也不可能进行列表初始化因为(在资源的初始值设定项列表的效果列表之后):
- 初始值设定项列表不为空
-
B
不是聚合 -
B
不是std::initializer_list
的专业化 -
B
没有- 采用初始值设定项列表的构造函数
- 适合列表签名的构造函数
-
B
不是引用类型 -
B
不能从123
进行复制初始化,也不能直接初始化,因为没有构造函数采用 int -
B
不是值初始化的,因为初始值设定项列表不为空
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- consteval wrapper vs. source_location
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- std::is_pod vs subclassing