随着GCC 4.8.0的发布,我们有一个支持自动返回类型推导的编译器,这是C++ 14的一部分.有了-std=c++1y,我可以这样做:
auto foo() { //deduced to be int
return 5;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我应该何时使用此功能?什么时候需要,何时使代码更清洁?
我能想到的第一个场景是可能的.每个可以用这种方式编写的函数都应该是.这个问题是它可能并不总是使代码更具可读性.
下一个场景是避免更复杂的返回类型.作为一个很轻的例子:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
Run Code Online (Sandbox Code Playgroud)
我不相信这确实会成为一个问题,虽然我认为在某些情况下明确依赖于参数的返回类型可能更清楚.
接下来,为了防止冗余:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
Run Code Online (Sandbox Code Playgroud)
在C++ 11中,我们有时可以return {5, 6, 7};代替向量,但这并不总是有效,我们需要在函数头和函数体中指定类型.这纯粹是多余的,自动返回类型扣除使我们免于冗余.
最后,它可以用来代替非常简单的功能:
auto position() {
return pos_;
}
auto area() {
return …Run Code Online (Sandbox Code Playgroud) 我与某人谈论了垮台事件std::stoi.坦率地说,它在std::strtol内部使用,如果报告错误则抛出.但是,根据他们的说法,std::strtol不应该为输入报告错误"abcxyz",导致stoi不抛出std::invalid_argument.
首先,这里有两个在GCC上测试过的关于这些案例行为的程序:
strtol
stoi
他们都表现出成功"123"和失败"abc".
我查看标准以获取更多信息:
§21.5
Throws: invalid_argument if strtol, strtoul, strtoll, or strtoull reports that
no conversion could be performed. Throws out_of_range if the converted value is
outside the range of representable values for the return type.
Run Code Online (Sandbox Code Playgroud)
总结了依赖的行为strtol.那怎么样strtol?我在C11草案中找到了这个:
§7.22.1.4
If the subject sequence is empty or does not have the expected form, no
conversion is performed; the value …Run Code Online (Sandbox Code Playgroud) 我能否在C++ 1y(C++ 14)中为main函数执行以下操作:
auto main()
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
int即使我们不需要使用显式,返回类型也会自动生成return 0;吗?
为什么这段代码中的条件true?
int main ( )
{
if ("")
cout << "hello"; // executes!
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在C++ 11中,a的字符std::string必须连续存储,如第21.4.1/5节所述:
basic_string对象中的char类对象应连续存储.也就是说,对于任何basic_string对象,标识&*(s.begin()+ n)==&*s.begin()+ n应该适用于n的所有值,使得0 <= n <s.size ().
但是,这里是§21.4.7.1如何列出两个函数来检索指向底层存储的指针(强调我的):
const charT*c_str()const noexcept;
const charT*data()const noexcept;
1返回:指针p,使得p + i ==&operator [](i)为[0,size()]中的每个i.
2复杂性:恒定时间.
3要求:程序不得更改存储在字符数组中的任何值.
我可以想到的第3点的一种可能性是指针可以通过对象的以下用途而变得无效(第21.4.1/6节):
即便如此,迭代器也会失效,但我们仍然可以修改它们,无论它们是什么.我们仍然可以使用指针,直到它变为无效以便从缓冲区读取.
为什么我们不能直接写入这个缓冲区?是因为它会使类处于不一致状态,例如,end()不会使用新结束更新?如果是这样,为什么允许直接写入类似的缓冲区std::vector?
用例包括能够将a的缓冲区传递std::string给C接口以检索字符串而不是传入一个字符串,vector<char>并使用迭代器初始化字符串:
std::string text;
text.resize(GetTextLength());
GetText(text.data());
Run Code Online (Sandbox Code Playgroud) 虽然讨论的Type(identifier);语法和它是如何声明,我碰到Type(::x);不锵工作.我希望给定一个全局变量x,它将被::x视为一个表达式(::x + 2作品)并转换::x为Type.但是,它给出了编译器错误.
这是一个简短的例子:
int x;
int main() {
int(::x); //does not compile
int(::x + 2); //compiles
}
Run Code Online (Sandbox Code Playgroud)
Clang 3.5给出的编译器错误是:
错误:'x'的定义或重新声明不能命名全局范围
但是,GCC 4.9.0编译就好了.这段代码有效吗?
当我正在开发一个将于2014年左右公开发布的C++库时,我目前正在做出设计选择.使用C++ 14发布的非常有用的工具之一是std::optional.我想知道g++/libstdc++我期望使用哪个版本的版本-std=c++1y.
这是我想要做的整体.需要明确的是,这不是作业或竞赛或其他任何事情.希望我的措辞足够清晰:
给定一组具有相同格式的字符串,但是其中一些字符串以小写字母结尾而另一些不以字母结尾,返回每个字符串中的一个不以小写字母结尾的集合,但是至少有一个相同的字符串以一个小写字母.
为了简单起见,我们假设字符串格式是\d+[a-z]?公共部分是数字.鉴于{1, 4, 3a, 1b, 3, 6c},我应该得到一个排列,{1, 3}因为1和3在结尾处都有一个带有和不带小写字母的元素.
您可以在此处查看此解决方案.
我想到这样做的一种方法是将集合划分为带有和不带小写字母后缀({1, 4, 3}和{3a, 1b, 6c})的元素,然后返回withoutSuffix.Where(x => withSuffix.Any(y => y.StartsWith(x))).
我有两个问题:
我没有看到使用谓词分区到两个集合的好方法Regex.IsMatch(input, "[a-z]$").我想到的两个是两个相似定义的变量,每个变量使用一个Where子句并对每个元素执行两次正则表达式匹配,或者转换集合以存储正则表达式匹配结果,然后从中形成两个变量.group...by当你需要像这样访问两个集合时似乎不能很好地发挥,但我可能在那里错了.
尽管尺寸足够小而不关心性能,但withSuffix每个withoutSuffix元素经历一次似乎是不优雅的.
您可以在此处查看此解决方案.
想到的另一种方法是获取公共前缀和可选后缀:{1 => {"", b}, 3 => {a, ""}, 4 => {""}, 6 => {c}}.这可以通过使用regex((\d+)([a-z])?)捕获前缀和后缀并将前缀分组为前缀来轻松实现grouped.
从这里开始,它会很棒:
where grouped.SomeButNotAll(x => x == …Run Code Online (Sandbox Code Playgroud) 正确地测试两个浮点数是否相等是包括我在内的很多人都不完全理解的.然而,今天,我想到了一些标准容器如何定义平等operator<.我总是看到人们在平等方面存在问题,但从未与其他关系比较相提并论.甚至可以使用它们的静默版本,其中包括除了平等和不平等之外的所有内容.
假设operator<作品"正常",不像operator==,为什么我们不能这样做:
bool floateq(float a, float b) {
//check NaN
return !(a < b) && !(b < a);
}
Run Code Online (Sandbox Code Playgroud)
其实,我并运行一个测试与双打额外的过载,因为看到这里,似乎有同样的缺陷作为他们的比较operator==:
std::cout << "float->double vs double: "
<< floateq(static_cast<double>(0.7f), 0.7) << " "
<< (static_cast<double>(0.7f) == 0.7) << "\n";
Run Code Online (Sandbox Code Playgroud)
输出:
float-> double vs double:0 0
我是否担心使用所有比较运算符,或者是否存在比较我不理解的浮点数的其他方面?
我正在自学C.我的目标是创建一个C函数,它只是遍历一个查询字符串并在&符号和等号上分开.我对Valgrind的这个错误感到困惑.
==5411== Invalid free() / delete / delete[] / realloc()
==5411== at 0x402AC38: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==5411== by 0x804857C: main (leak.c:28)
==5411== Address 0x420a02a is 2 bytes inside a block of size 8 free'd
==5411== at 0x402AC38: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==5411== by 0x804857C: main (leak.c:28)
==5411==
==5411==
==5411== HEAP SUMMARY:
==5411== in use at exit: 0 bytes in 0 blocks
==5411== total heap usage: 1 allocs, 2 frees, 8 bytes allocated
==5411==
==5411== All heap blocks were freed -- no …Run Code Online (Sandbox Code Playgroud)