在导出包含与visual studio警告C4251相关的stl类的类之前,有一些问题:例如这个问题或这个问题.我已经阅读过UnknownRoad的优秀解释.
盲目地禁用警告似乎有点危险,尽管它可能是一种选择.包装所有这些std类并导出它们也不是一个真正的选择.它毕竟被称为标准模板库...即,想要提供这些标准类的接口.
如何在我的dll界面中使用stl-classes?什么是常见做法?
根据标准草案(23.3.6.4向量数据),data()指向底层数组,并且[data(), data() + size())必须是有效范围:
T* data() noexcept;
const T* data() const noexcept;
1 Returns: A pointer such that [data(),data() + size()) is a valid range. For a non-empty vector,
data() == &front().
2 Complexity: Constant time
Run Code Online (Sandbox Code Playgroud)
但是如果向量是空的呢?当我构造一个零大小的向量时:
#include <vector>
#include <iostream>
int main() {
const int NUM = 0*10;
std::vector< double > v( NUM, 0.0 );
std::cerr << "V : "<< v.data() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
MSVC 2010返回null,但在Linux(使用GCC 4.2.1和Intel 12.1)上,我得到一个非空地址.
是vector::data()允许还是应该返回null?例如,一个实现可以执行默认大小的初始分配并返回一个(非空)指针吗?
编辑:几个答案集中在空范围的有效性.我完全同意.
我真的希望看到一个很好的引用或解释:是否允许 …
我有一小段代码有一个声明 void();
int main()
{
void( ); // 1: parses fine in GCC 5.4.0 -Wpedantic
// void; // 2: error declaration does not declare anything
}
Run Code Online (Sandbox Code Playgroud)
什么是1 void()?
是什么让1 void()与2不同void;?
我已经读过了:
但我很好奇松散的声明是否为void(); 不同于其中之一(当然为什么)