我收到以下代码的警告签名/未签名不匹配:
auto n = a.size();
for (auto i = 0; i < n; i++) {
}
Run Code Online (Sandbox Code Playgroud)
问题是通过为i
它分配0 int
而不是size_t
.那么更好的是:
size_t n = a.size();
for (size_t i = 0; i < n; i++) {
}
Run Code Online (Sandbox Code Playgroud)
或这个:
auto n = a.size();
for (size_t i = 0; i < n; i++) {
}
Run Code Online (Sandbox Code Playgroud)
或者你有更好的解决方案?我更喜欢第一个,因为它更加一致,它只是使用size_t
而不是两个size_t
并且auto
用于相同的目的.
这个定义有效:
const auto &b{nullptr};
Run Code Online (Sandbox Code Playgroud)
虽然失败了:
auto *b{nullptr};
Run Code Online (Sandbox Code Playgroud)
我试图在Visual C++,GCC和Clang中编译它.他们都抱怨"不能推断出类型".
在第二种情况下,不b
应该推断出有某种类型的std::nullptr_t
?
这是一个关于类内朋友函数的返回类型推导的小实验(std=c++1y
在两种情况下都使用Clang 3.4 SVN和g ++ 4.8.1 ),链接工作文件中没有记录
#include <iostream>
struct A
{
int a_;
friend auto operator==(A const& L, A const& R)
{
return L.a_ == R.a_; // a_ is of type int, so should return bool
}
};
template<class T>
struct B
{
int b_;
friend auto operator==(B const& L, B const& R)
{
return L.b_ == R.b_; // b_ is of type int, so should return bool
}
};
using BI = B<int>;
int main() …
Run Code Online (Sandbox Code Playgroud) C++ 14支持通用lambda.但是,clang 3.4拒绝以下代码.
#include <utility>
void f(int);
void f(int&);
int main()
{
[](auto&& v) { f(std::forward<auto>(v)); }(8); // error
}
Run Code Online (Sandbox Code Playgroud)
如何auto&&
在一般的lambda中完美前进?
从我的个人经验以及从咨询答案到诸如decltype(auto)有什么用途的问题?我可以找到许多有价值的用例decltype(auto)
作为函数返回类型占位符。
但是,我在努力思考decltype(auto)
变量的任何有效(即有用,现实,有价值)用例时都非常费劲。我想到的唯一可能性是存储函数返回的结果以decltype(auto)
供以后传播,但auto&&
也可以在此使用,这样会更简单。
我什至搜索了我所有的项目和实验,其中391个出现的decltype(auto)
都是返回类型的占位符。
那么,变量是否有实际的用例decltype(auto)
?还是仅当用作返回类型占位符时此功能才有用?
您如何定义“现实”?
我正在寻找一个能提供价值的用例(即,不仅仅是显示功能如何工作的示例)decltype(auto)
,与诸如auto&&
或根本不声明变量的替代方案相比,哪里是最佳选择。
问题域无关紧要,它可能是一些晦涩的元编程极端案例或神秘的功能编程构造。但是,该示例需要使我接受“嘿,这很聪明/很漂亮!” 而使用任何其他功能来达到相同的效果将需要更多样板,或者存在某种缺陷。
我正在使用C++ 11项目clang++-3.4
,并决定编译使用g++-4.8.2
,以防产生的错误有任何差异.事实证明,g ++拒绝了一些clang ++接受的代码.我已将问题减少到下面给出的MWE.
enum { a };
template <class T>
struct foo
{
static constexpr auto value = a;
};
int main()
{
static constexpr auto r = foo<int>::value;
}
Run Code Online (Sandbox Code Playgroud)
foo.cpp:5:23:错误:'
const<anonymous enum> foo<int>::value
',使用匿名类型声明,但是使用但从未定义[-fpermissive]Run Code Online (Sandbox Code Playgroud)static const auto value = A;
我想帮助回答以下两个问题:
哪个编译器在解释标准时是正确的?我假设一个编译器正确接受或拒绝代码,另一个是错误的.
我该如何解决这个问题?我无法命名匿名枚举,因为它来自第三方库(在我的情况下,枚举是Eigen::RowMajor
和Eigen::ColMajor
).
我有一个C++ 14代码.但是,当我在C++ 11中使用它时,它有一个错误const auto
.如何在C++ 11中使用它?
vector<vector <int> > P;
std::vector<double> f;
vector< pair<double, vector<int> > > X;
for (int i=0;i<N;i++)
X.push_back(make_pair(f[i],P[i]));
////Sorting fitness descending order
stable_sort(X.rbegin(), X.rend());
std::stable_sort(X.rbegin(), X.rend(),
[](const auto&lhs, const auto& rhs) { return lhs.first < rhs.first; });
Run Code Online (Sandbox Code Playgroud) 我想(想)我明白了auto
.同样的decltype
.但是,在C++ 14中,可以有一些像decltype(auto)
生成函数的返回类型那样的代数.考虑以下:
decltype(auto) foo()
{
int m = 1;
return m;
}
Run Code Online (Sandbox Code Playgroud)
返回类型是int
,一切都有意义.
然而,
decltype(auto) foo()
{
int m = 1;
return (m);
}
Run Code Online (Sandbox Code Playgroud)
返回int&
(即引用int
).
我绝对没有想到为什么会发生这种情况,为什么这些括号根本没有任何区别!?希望有人可以对此有所了解.
PS:我也标记过,C++
因为有更多的人检查C++
标签C++14
.
我有这样的代码:
template<class ListItem>
static void printList(QList<ListItem>* list)
{
for (auto i = list->size() - 1, j = -1; i >= 0; --i) {
std::cout << i << ", " << j << ": " << list->at(i) << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
当我用g ++ 6.2.1编译它时,我得到以下编译器输出:
test.cpp: In function ‘void printList(QList<T>*)’:
test.cpp:10:7: error: inconsistent deduction for ‘auto’: ‘auto’ and then ‘int’
for (auto i = list->size() - 1, j = -1; i >= 0; --i) {
^~~~
Run Code Online (Sandbox Code Playgroud)
我理解这一点,如果变量有不同的类型auto i = 0.0, j …
C++20 允许使用auto
函数参数类型。
它是否还允许auto
用作函数参数类型的模板参数占位符(不相似,但在某种程度上符合C++17 template<auto>的精神)?
所以下面的代码,在 C++20 之前:
template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
std::cout << p.first << ", " << p.second;
}
Run Code Online (Sandbox Code Playgroud)
可以写成:
void printPair(const std::pair<auto, auto>& p) {
std::cout << p.first << ", " << p.second;
}
Run Code Online (Sandbox Code Playgroud)
它确实可以编译并与概念的实验性 GCC 实现一起很好地工作。
它是 C++20 的合法语法吗?