我有以下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).[例如:
Run Code Online (Sandbox Code Playgroud)template<class... Args> void f(Args... args) { auto lm = [&, args...] { return g(args...); }; lm(); }- 结束例子]
然而,虽然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) 我有一个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) 试图编译这段代码:
const int a = 1;
auto lambda = [&]() {
&a;
};
lambda();
Run Code Online (Sandbox Code Playgroud)
在clang ++上一切都很好,但是g ++给出了一个错误:
错误:左值作为一元'&'操作数
我没有找到解释这种行为的任何东西.这是g ++中的错误吗?或者clang ++会错过什么吗?
根据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]>.
我有一系列短的(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在某处被破坏了).我没有收到错误记录.
我真的坚持为什么暂停调试器的播放方法会导致这种情况发生.有什么建议或想法吗?
可以通过嵌套括号括起的列表来创建多维初始值设定项,如{{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) 对于空容器,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".
在更实际的层面上,我正在考虑检查状态的项目集合,就像任何"准备好处理"一样,并期望空集合对应于"否,没有准备好处理的元素".我知道我可以检查它是否是空的,但我正在寻找其他可能性.
我看看Generic lambdas并且无法得到它 - 为什么要保留类型声明?为什么不
(x, y)呢?如果编译器供应商必须支持(auto a, auto b)是否有任何支持简单的问题(a, b)?
我正在使用通过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++ 11 char16_t和char32_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_t和char32_t仅仅类型定义为unsigned short和unsigned在[..]\Microsoft Visual Studio 12.0\VC\include\yvals.h.
所以我查了一下
std::is_same<char32_t, unsigned>::value
是true在VS和false海湾合作委员会.
所以我的问题是:
char16_t和char32_t标准中的新原始类型(这两种类型的VS实现是非标准的吗?) …c++ ×9
c++11 ×8
lambda ×3
c++14 ×2
clang++ ×1
compiler-bug ×1
g++ ×1
g++4.8 ×1
gcc ×1
ios ×1
objective-c ×1
rvalue ×1
unique-ptr ×1