我g++ -std=c++0x pod_test.cpp
在g ++ 4.6.2(mingw)上运行了下面的内容.我在A4上收到错误.为什么不是A4 POD?
#include <iostream>
#include <new>
#include <cstring>
using namespace std;
struct A {
int a, b;
char c;
};
struct A2 {
short buf[1];
};
struct A3:A {
};
struct A4:A {
short buf[1];
};
static_assert(std::is_pod<A>::value, "Struct must be a POD type");
static_assert(std::is_pod<A2>::value, "Struct must be a POD type");
static_assert(std::is_pod<A3>::value, "Struct must be a POD type");
static_assert(std::is_pod<A4>::value, "Struct must be a POD type");
int main(){}
Run Code Online (Sandbox Code Playgroud) 构建项目时,我看到构建错误:ProjectName.debug.xcconfig unable to open file
。我不明白我很长一段时间的问题,但今天我拿注意,哪个目录是错误的:完整的错误:projectName/Pods/Pods...ProjectName.debug.xcconfig unable to open file
其中Pods
部分重复,所以正确的目录必须是projectName/Pods...ProjectName.debug.xcconfig
如何解决的呢?
我有一个DLL,需要访问存储在主机应用程序中的STL容器中的数据.因为C++没有标准的ABI,并且我想支持不同的编译器,所以应用程序和DLL之间的接口基本上必须保持普通的旧数据.
对于向量,这是相对简单的.你可以简单地返回向量的内存块,因为它保证是有条件的:
// To return vector<int> data
virtual void GetVectorData(const int*& ptr, size_t& count) const
{
if (!vec.empty())
ptr = &(vec.front());
count = vec.size();
}
Run Code Online (Sandbox Code Playgroud)
现在,DLL可以通过该接口对向量的数据进行安全的只读访问.DLL也可以包装它以将内容复制到自身的向量中.
那么STL列表(和deques)呢?是否有另一种直接允许通过DLL边界访问的方法?或者我是否必须使用某种GetFirst()/ GetNext()接口?我可能需要为很多列表执行此操作,因此有一个像vector一样简单的解决方案会很好.
我似乎记得有一个"官方"网站(perl.org或cpan.org),它有一个POD预览器.一个人上传了一个文件,它将显示包含在PAN上的POD.有人有此链接吗?我似乎找不到它.
我需要将Pod转换为HTML.有许多Pod :: HTML和Pod :: Simple ::*模块.我应该使用哪一个?
在C++ 0x中,我想确定一个类是否是平凡的/具有标准布局,所以我可以使用memcpy(),memset()等...
我应该如何使用type_traits实现下面的代码,所以我可以确认一个类型是微不足道的?
template< typename T >
bool isTrivialType()
{
bool isTrivial = ???
return isTrivial;
}
Run Code Online (Sandbox Code Playgroud)
注意:is_pod()限制太多:我希望我的类有简单的构造函数等......为方便起见.
补充:我认为std :: is_standard_layout <>可能会给我我正在寻找的东西.1.如果我添加构造函数,它仍然返回true 2.如果我添加一个虚方法,它返回false这是我需要确定我是否可以使用memcpy(),memset()
编辑:来自Luc Danton的解释和链接(澄清):
struct N { // neither trivial nor standard-layout
int i;
int j;
virtual ~N();
};
struct T { // trivial but not standard-layout
int i;
private:
int j;
};
struct SL { // standard-layout but not trivial
int i;
int j;
~SL();
};
struct POD { // both trivial and standard-layout
int i;
int j; …
Run Code Online (Sandbox Code Playgroud) 如果这是不可能的,处理从UTF-8编码的POD派生的手册页的最佳做法是什么?
要在POD中使用Unicode,要做的第一件事就是使用该指令
=encoding UTF-8
Run Code Online (Sandbox Code Playgroud)
(如所讨论此处).该pod2text
和pod2html
工具将正常工作,并产生完美的UTF-8编码输出.
pod2man
但是,该工具不会:
pod2man -u MyModule.pm | nroff -Tutf8 -man | less
Run Code Online (Sandbox Code Playgroud)
也没有perldoc
.非ASCII字符都被破坏或X-ed输出.关于perlbug是否可能是一个错误或**roff*,有一些不确定的讨论pod2man
.
由于我的模块专门处理Unicode并且打算在CPAN上进行分发,因此必须使用支持Unicode的手册页.
我使用的是Perl 5.14.2,perldoc 3.15和*roff 1.21.
移动语义对RAII类很有用.它们允许一个人编程,好像一个人有价值语义而没有沉重的副本.一个很好的例子是从函数返回std :: vector.然而,使用值语义进行编程意味着,人们会期望类型的行为类似于原始数据类型.这两个方面有时似乎不一致.
一方面,在RAII中,人们会期望默认构造函数返回完全初始化的对象,或者如果资源获取失败则抛出异常.这可以保证任何构造的对象都处于有效且一致的状态(即安全使用).
另一方面,对于移动语义,当对象处于有效但未指定的状态时存在一个点.类似地,原始数据类型可以处于未初始化状态.因此,使用值语义,我希望默认构造函数在此有效但未指定的状态下创建对象,以便以下代码具有预期的行为:
// Primitive Data Type, Value Semantics
int i;
i = 5;
// RAII Class, Move Semantics
Resource r;
r = Resource{/*...*/}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我都希望"重"初始化只发生一次.我想知道,这方面的最佳做法是什么?显然,第二种方法存在一些实际问题:如果默认构造函数在未指定状态下创建对象,那么如何编写一个获取资源的构造函数,但不采用其他参数?(标记调度会浮现在脑海中......)
编辑:一些答案质疑试图让你的类像原始数据类型一样工作的理由.我的一些动机来自亚历山大·斯捷潘诺夫(Alexander Stepanov)的"高效编程与组件"(Efficient Programming with Components),他讲述了常规类型 特别是,让我引用一下:
无论c [内置类型]中的自然惯用表达是什么,都应该是常规类型的自然惯用表达式.
他继续提供与上面几乎相同的例子.他的观点在这方面是否有效?我理解错了吗?
编辑:由于没有太多的讨论,我即将接受最高投票的答案.在默认构造函数中以"从 - 移动状态"状态初始化对象可能不是一个好主意,因为每个同意现有答案的人都不会期望这种行为.
C++中的引用类型也是POD类型吗?是int&
POD类型吗?那怎么样?
struct Q { int& i; }
Run Code Online (Sandbox Code Playgroud)
有人可以帮帮我吗?
鉴于以下内容
#include <array>
struct litmus final : std::array<unsigned char, 16>
{
};
static_assert(std::is_pod<std::array<unsigned char, 16> >::value, "not pod");
// this fails on MSVC:
static_assert(std::is_pod<litmus>::value, "not pod");
Run Code Online (Sandbox Code Playgroud)
以下编译器同意litmus
pod:
但是,MSVC12(VS2013 RTM)认为第二个断言失败.
编辑有关信息:
is_trivially_copyable<litmus>
在MSVC上返回true-ness.对于许多不严格要求实际POD的情况,这可能很有用.