我找到了这样的代码:
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
Run Code Online (Sandbox Code Playgroud)
我想到了所有细节,这对我来说是新的,但只有一个.请告诉我,在哪里可以阅读,箭头操作符(->)在函数标题中的含义是什么?我纯粹从逻辑上说,那个->算子确定了一个类型,auto但是我希望得到这个,但找不到信息.
auto在C++ 14标准中,通用lambda如何工作(关键字作为参数类型)?
它是基于C++模板的,每个不同的参数类型编译器生成一个具有相同主体但替换类型(编译时多态)的新函数,还是更类似于Java的泛型(类型擦除)?
代码示例:
auto glambda = [](auto a) { return a; };
Run Code Online (Sandbox Code Playgroud) autoJava中是否有像C++一样的变量类型?
一个例子:
for ( auto var : object_array)
std::cout << var << std::endl;
for( auto var : object_array)
var.do_something_that_only_this_particular_obj_can_do();
Run Code Online (Sandbox Code Playgroud)
我知道Java中有一个增强的for循环,但是有自动吗?如果没有,是否有这样做的黑客?我指的是C++ 11中的新功能
可能重复:
使用C++ 0x auto关键字多少钱
我们(作为社区)是否有足够的经验来确定何时和/或是否滥用汽车?
我真正想要的是最佳实践指南
简单的经验法则可以在80%的情况下快速遵循.
由于上下文这个问题由我的回应引发了这里
C++ 11支持新的函数语法:
auto func_name(int x, int y) -> int;
Run Code Online (Sandbox Code Playgroud)
目前此函数将声明为:
int func_name(int x, int y);
Run Code Online (Sandbox Code Playgroud)
新风格似乎还没有被广泛采用(比如在gcc stl中)
但是,这种新风格是否应该在新的C++ 11程序中随处可见,还是仅在需要时使用?
就个人而言,我更喜欢旧款式,但是混合风格的代码库看起来很丑陋.
我正在从C++ 98转向C++ 11并熟悉该auto关键字.我想知道为什么我们需要显式声明auto编译器是否能够自动推断出类型.我知道C++是一种强类型语言,这是一个规则但是如果没有明确声明变量就不可能实现相同的结果auto吗?
#include <iostream>
int main(){
auto lambda = [] {
return 7;
};
std::cout << lambda() << '\n';
}
Run Code Online (Sandbox Code Playgroud)
该程序编译并打印7.
lambda的返回类型基于返回值7推导为整数类型.
为什么普通功能不能实现这一点?
#include <iostream>
auto function(){
return 42;
}
int main(){
std::cout << function() << '\n';
}
Run Code Online (Sandbox Code Playgroud)
错误:'function'函数使用'auto'类型说明符而没有尾随返回类型
在 C++20 中,我们现在能够将auto关键字限制为仅属于特定类型。因此,如果我有一些如下所示的代码,没有任何限制:
auto something(){
return 1;
}
int main(){
const auto x = something();
return x;
}
Run Code Online (Sandbox Code Playgroud)
这里的变量x被推导为一个int。然而,随着 C++20 的引入,我们现在可以将 约束auto为某种类型,如下所示:
std::integral auto something(){
return 0;
}
int main(){
const auto x = something();
return x;
}
Run Code Online (Sandbox Code Playgroud)
这不是违背了来这里的目的吗auto?如果我真的需要一个std::integral数据类型,我不能完全省略吗auto?我是否完全误解了使用auto?
请看下面的简单代码:
class Foo
{
public:
Foo(){}
~Foo(){}
Foo(const Foo&){}
Foo& operator=(const Foo&) { return *this; }
};
static Foo g_temp;
const Foo& GetFoo() { return g_temp; }
Run Code Online (Sandbox Code Playgroud)
我试着auto像这样使用:
auto my_foo = GetFoo();
Run Code Online (Sandbox Code Playgroud)
我希望这my_foo将是一个常量引用Foo,这是函数的返回类型.但是,类型auto是Foo,而不是参考.此外,my_foo是通过复制创建的g_temp.这种行为对我来说并不那么明显.
为了获得引用Foo,我需要这样写:
const auto& my_foo2 = GetFoo();
auto& my_foo3 = GetFoo();
Run Code Online (Sandbox Code Playgroud)
问题:为什么auto推断出GetFoo作为对象的返回类型,而不是引用?
如何找出编译器在使用auto关键字时推断出的类型?
示例1:更简单
auto tickTime = 0.001;
Run Code Online (Sandbox Code Playgroud)
这被推断为a float或adouble?
例2:更复杂(以及我目前的头痛):
typedef std::ratio<1, 1> sec;
std::chrono::duration<double, sec > timePerTick2{0.001};
auto nextTickTime = std::chrono::high_resolution_clock::now() + timePerTick2;
Run Code Online (Sandbox Code Playgroud)
什么类型nextTickTime?
我遇到的问题是当我尝试发送nextTickTime时std::cout.我收到以下错误:
./main.cpp: In function ‘int main(int, char**)’:
./main.cpp:143:16: error: cannot bind ‘std::basic_ostream<char>’ lvalue to ‘std::basic_ostream<char>&&’
std::cout << std::setprecision(12) << nextTickTime << std::endl; // time in seconds
^
In file included from /usr/include/c++/4.8.2/iostream:39:0,
from ./main.cpp:10:
/usr/include/c++/4.8.2/ostream:602:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) …Run Code Online (Sandbox Code Playgroud) auto ×10
c++ ×10
c++11 ×7
lambda ×2
c++-chrono ×1
c++-concepts ×1
c++14 ×1
c++20 ×1
decltype ×1
function ×1
java ×1
reference ×1
type-safety ×1