小编Dan*_*rey的帖子

编译器错误,还是非标准代码? - lambda中的变异模板捕获

我有以下C++ 11代码;

template<typename... T>
int g(T... t)
{
    return 0;
}

template<class... Args>
void f(Args... args)
{
    auto lm = [&, args...] { return g(args...); };
    lm();
}

int main()
{
    f(2, 5, 7);
}
Run Code Online (Sandbox Code Playgroud)

据我所知,我相信它是有效的C++ 11; 标准第5.1.2.23节;

捕获后跟省略号是包扩展(14.5.3).[例如:

template<class... Args> void f(Args... args) {
    auto lm = [&, args...] { return g(args...); }; lm();
}
Run Code Online (Sandbox Code Playgroud)

- 结束例子]

然而,虽然Clang ++编译得很好,但G ++提供了这个错误;

main.cpp: In function 'void f(Args ...)':
main.cpp:10:23: error: expected ',' before '...' token
     auto lm = [&, args...] { …
Run Code Online (Sandbox Code Playgroud)

c++ lambda compiler-bug variadic-templates c++11

5
推荐指数
1
解决办法
913
查看次数

是否将rvalue作为参数传递给函数内的左值?

我有一个View和一个Shape类,其中View"拥有"它的Shape对象.我将其实现为unique_ptr的向量.在函数View :: add_shape(std :: unique_ptr && shape)中,我仍然需要在rvalue参数上使用std :: move来进行编译.为什么?(使用GCC 4.8)

#include <memory>
#include <vector>
using namespace std;

class Shape { };
class View
{
  vector<unique_ptr<Shape>> m_shapes;
  public:
  void add_shape(unique_ptr<Shape>&& shape)
  { 
    m_shapes.push_back(std::move(shape));// won't compile without the std::move
  }
};


int main()
{
  unique_ptr<Shape> ups(new Shape);
  View v;
  v.add_shape(std::move(ups));
}
Run Code Online (Sandbox Code Playgroud)

c++ rvalue c++11

5
推荐指数
1
解决办法
432
查看次数

C++ 11 lambda不引用const变量,为什么?

试图编译这段代码:

const int a = 1;
auto lambda = [&]() {
  &a;
};
lambda();
Run Code Online (Sandbox Code Playgroud)

在clang ++上一切都很好,但是g ++给出了一个错误:

错误:左值作为一元'&'操作数

我没有找到解释这种行为的任何东西.这是g ++中的错误吗?或者clang ++会错过什么吗?

c++ lambda g++ c++11 clang++

5
推荐指数
1
解决办法
260
查看次数

make_unique的第三个"重载"的目的是什么?

根据N3797,std::make_unique有三个"过载":

20.8.1.4 unique_ptr创建[unique.ptr.create]

template <class T, class... Args> unique_ptr<T> make_unique(Args&&... args);

1 备注:除非T不是数组,否则此函数不应参与重载决策.

2 返回: unique_ptr<T>(new T(std::forward<Args>(args)...)).

template <class T> unique_ptr<T> make_unique(size_t n);

3 备注:除非T是未知范围的数组,否则此函数不应参与重载决策.

4 返回: unique_ptr<T>(new remove_extent_t<T>[n]()).

template <class T, class... Args>unspecifiedmake_unique(Args&&...) = delete;

5 备注:除非T是已知绑定的数组,否则此函数不应参与重载决策.

我不明白第三个删除重载的原因.如果T是已知边界的数组,前两个不参与重载决策,那么为什么标准指定第三个?将它遗漏并仅指定前两个过载是不是完全相同?

编辑:请注意,我知道为什么make_unique<T[N]>不允许.问题不在于此,而是为什么需要第三次重载.AFAICT,拥有或不拥有它的效果是相同的,甚至是wrt make_unique<T[N]>.

c++ unique-ptr c++11 c++14

5
推荐指数
0
解决办法
238
查看次数

iOS AVAudioPlayer奇怪的行为

我有一系列短的(1秒)声音片段我需要连续播放.正在为此目的开发一个班级.我正在使用以下代码:

- (void) playClip: (NSData *)clipToPlay
{
    NSError *error = nil;
    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithData: clipToPlay error:&error];
    audioPlayer.numberOfLoops = 0;
    audioPlayer.volume = 1.0f;
    [audioPlayer prepareToPlay];

    if (audioPlayer == nil)
        NSLog(@"%@", [error description]);
    else
        [audioPlayer play];
}
Run Code Online (Sandbox Code Playgroud)

可以看出,clipToPlay包含一个声音片段NSData.这段代码的行为很奇怪.如果我在调试器中运行它并在以下行设置断点:

[audioPlayer play];
Run Code Online (Sandbox Code Playgroud)

剪辑按预期播放 - 调试器在线上暂停,当您单步执行时,剪辑可以完美播放.但是,如果我把断点拿出来,它根本就不会播放.

我已经尝试首先将其复制NSData到临时文件,结果完全相同.我也复制clipToPlay到另一个变量(使用副本,而不仅仅是一个指针赋值)具有相同的结果(我想也许clipToPlay在某处被破坏了).我没有收到错误记录.

我真的坚持为什么暂停调试器的播放方法会导致这种情况发生.有什么建议或想法吗?

objective-c avaudioplayer ios

4
推荐指数
1
解决办法
261
查看次数

嵌套的std :: initializer_lists的数据元素是否保证是连续的?

可以通过嵌套括号括起的列表来创建多维初始值设定项,如{{1,2,3}, {4,5,6}}.接受此功能的函数可以使用嵌套std::initializer_lists 编写.

数据元素是否保证是连续的?

这是一个例子:

void f(std::initializer_list<std::initializer_list<int>> a)
{
  for(auto const & p: a)
    for(auto const & q: p)
      std::cout << &q << std::endl;
}

int main()
{
  f({{1,2,3}, {4,5,6}});
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在我的机器上输出连续的地址.

0x400c60
0x400c64
0x400c68
0x400c6c
0x400c70
0x400c74
Run Code Online (Sandbox Code Playgroud)

有保证吗?

更新

答案必须是否定的.

void g(std::initializer_list<int> a, std::initializer_list<int> b)
{
  f({b,a});
}

int main()
{
  g({1,2,3}, {4,5,6});
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

0x400cdc
0x400ce0
0x400ce4
0x400cd0
0x400cd4
0x400cd8
Run Code Online (Sandbox Code Playgroud)

c++ initializer-list c++11

4
推荐指数
1
解决办法
678
查看次数

使用std :: all_of()和std:none_of()的空容器的好习惯用法?

对于空容器,std :: all_of()和std:none_of()都返回true.

除了辩论这个概念方面,有人可以提出一个成语,不要求总是检查容器是否为空并检查all_of或none_of?

这很麻烦,因为在空容器上的两个算法中使用相同的谓词将表明谓词对于ALL和NONE都是正确的.所以,你的(空)向量是all_of"odd",all_of"even",none_of"odd"和none_of"even".

在更实际的层面上,我正在考虑检查状态的项目集合,就像任何"准备好处理"一样,并期望空集合对应于"否,没有准备好处理的元素".我知道我可以检查它是否是空的,但我正在寻找其他可能性.

c++ stl-algorithm c++11

3
推荐指数
1
解决办法
1451
查看次数

为什么C++ 14 Generic lambdas需要自动参数规范?

我看看Generic lambdas并且无法得到它 - 为什么要保留类型声明?为什么不 (x, y)呢?如果编译器供应商必须支持(auto a, auto b)是否有任何支持简单的问题(a, b)

c++ lambda c++14

3
推荐指数
1
解决办法
289
查看次数

小牛队的C++ 11发生了什么奇怪的事情?

我正在使用通过MacPorts安装的gcc 4.8,旧的C++ 11代码将不再编译

如果我使用没有-std = c ++ 11标志的编译器,它可以正常使用此测试代码

#include <cctype>

int main() {
  std::isalnum('c');
  return 0;
}


[bash] g++48 test.cpp 
Run Code Online (Sandbox Code Playgroud)

但是在小牛队升级之后我得到以下编译错误:

[bash] g++48 -std=c++11  test.cpp 

Undefined symbols for architecture x86_64:
  "isalnum(int)", referenced from:
      _main in ccvsKeqJ.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

有没有人知道可能导致这个问题的原因?我感谢任何帮助

c++ c++11 osx-mavericks g++4.8

3
推荐指数
2
解决办法
5939
查看次数

C++ 11中的char16_t和char32_t类型

据我了解,在C++ 11 char16_tchar32_t不是类型定义,但新的基本数据类型.(如果我错了,请纠正我).

我正在编写一个用于linux gcc和Windows Visual Studio的库.所以我写了一个特点:

template <class T>
struct IsChar : std::false_type {
};

template <>
struct IsChar<char> : std::true_type {
};

template <>
struct IsChar<wchar_t> : std::true_type {
};

template <>
struct IsChar<char16_t> : std::true_type {
};

template <>
struct IsChar<char32_t> : std::true_type {
};
Run Code Online (Sandbox Code Playgroud)

然而,我注意到,在VS(2013),char16_tchar32_t仅仅类型定义为unsigned shortunsigned[..]\Microsoft Visual Studio 12.0\VC\include\yvals.h.

所以我查了一下

std::is_same<char32_t, unsigned>::value

true在VS和false海湾合作委员会.

所以我的问题是:

  1. char16_tchar32_t标准中的新原始类型(这两种类型的VS实现是非标准的吗?) …

c++ gcc c++11 visual-studio-2013

3
推荐指数
1
解决办法
3685
查看次数