小编And*_*dré的帖子

如何在我的dll界面或ABI中使用标准库(STL)类?

在导出包含与visual studio警告C4251相关的stl类的类之前,有一些问题:例如这个问题或这个问题.我已经阅读过UnknownRoad的优秀解释.

盲目地禁用警告似乎有点危险,尽管它可能是一种选择.包装所有这些std类并导出它们也不是一个真正的选择.它毕竟被称为标准模板库...即,想要提供这些标准类的接口.

如何在我的dll界面中使用stl-classes?什么是常见做法?

c++ dll stl std c++11

62
推荐指数
1
解决办法
1万
查看次数

如果向量为空,std :: vector :: data()应该返回什么?

根据标准草案(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?例如,一个实现可以执行默认大小的初始分配并返回一个(非空)指针吗?

编辑:几个答案集中在空范围的有效性.我完全同意.

我真的希望看到一个很好的引用或解释:是否允许 …

c++ vector

16
推荐指数
2
解决办法
6864
查看次数

是一个声明void(); 合法的,实际上是什么?

我有一小段代码有一个声明 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;

我已经读过了:

  1. sizeof(void())是一个合法的表达式吗?但是void()被认为是sizeof中的一个类型
  2. decltype(void())中的void()究竟是什么意思?在declspec中考虑它.
  3. 我读的是无效{}合法与否?

但我很好奇松散的声明是否为void(); 不同于其中之一(当然为什么)

c++ language-lawyer

8
推荐指数
1
解决办法
283
查看次数

标签 统计

c++ ×3

c++11 ×1

dll ×1

language-lawyer ×1

std ×1

stl ×1

vector ×1