这个答案有一个这样的代码片段:
template<class T, class F>
auto f(std::vector<T> v, F fun)
-> decltype( bool( fun(v[0] ) ), void() )
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
它真正编译和工作(至少在Ideone上).
那么,在这种情况下如何推断出类型?
c ++ 11标准真的允许下一行吗?
decltype( bool( fun(v[0] ) ), void() )
Run Code Online (Sandbox Code Playgroud)
我快速浏览了一下,看起来并不合适.在这种情况下,意识错误吗?
c ++ 11标准中的所有示例都是这样的,它们在decltype中只有一种类型:
struct A {
char g();
template<class T> auto f(T t) -> decltype(t + g())
{ return t + g(); }
};
Run Code Online (Sandbox Code Playgroud)
另一个例子 :
void f3() {
float x, &r = x;
[=] {
decltype(x) y1;
decltype((x)) y2 = y1; …Run Code Online (Sandbox Code Playgroud) 考虑这个功能
template<class T> inline bool cx(T &a, T b) {return a < b ? a = b, 1 : 0;}
Run Code Online (Sandbox Code Playgroud)
任何人都能解释这究竟是做什么的吗?它似乎与典型的condition ? true : false格式不同.
我有一个简单的问题,我主要是因为我的好奇.
这两行代码之间有什么区别?(在C++中)
for(int i = 0; i < N, N > 0; i++)
for(int i = 0; i < N && N > 0; i++)
Run Code Online (Sandbox Code Playgroud)
条件的选择是完全随意的,我只是对&和之间的差异感兴趣.
我不是任何编码的初学者,但我从未打扰过逗号运算符.
是否有性能/行为差异或纯粹是美学?
最后一点,我知道有一个比条件运算符更好的性能鱼,但我只是好奇.放纵我.
编辑 感谢您的回答.
事实证明,提示这个问题的代码以我描述的方式滥用了逗号运算符.我想知道区别是什么以及为什么它不是&&运算符,但它只是写得不正确.我觉得它没有任何问题,因为它运作得很好.谢谢你把我拉直了.
我刚碰到这段代码:
delete a, a = 0;
Run Code Online (Sandbox Code Playgroud)
它编译并运行得很好.但这不应该是:
delete a;
a = 0;
Run Code Online (Sandbox Code Playgroud)
为什么分离语句使用,在这种情况下允许?
谢谢 :)
标题有点模糊,因为我真的不知道如何定义这个问题.
它与以下代码有关:
for (match = root,
m_matchBase = match->requestedBase,
m_matchLength = match->length;
match != NULL;
match = match->next,
m_matchBase = match->requestedBase,
m_matchLength = match->length)
{
if (m_matchBase <= m_base && m_matchBase + m_matchLength > m_base)
break;
// other stuff...
}
Run Code Online (Sandbox Code Playgroud)
for循环中的语句是否保证按顺序运行?
例如,m_matchBase = match->requestedBase保证运行之后match = match->next?
我正在尝试运算符重载,发现了一些我无法解释的东西:
WeekDays.h
using namespace std;
enum DAYS
{
MON,
TUE,
WED,
THU,
FRY,
SAT,
SUN
};
DAYS operator+(DAYS&a,DAYS &b)
{
printf("Binary+ called\n");
return (DAYS)(((unsigned int)a+(unsigned int)b)%7);
}
//Increment 3
DAYS operator+(DAYS&a)
{
printf("Unary+ called\n");
return (DAYS)(((unsigned int)a+3)%7);
}
ostream& operator<<(ostream&o, DAYS &a)
{
switch(a){
case MON: o<<"MON"; break;
case TUE: o<<"TUE"; break;
case WED: o<<"WED"; break;
case THU: o<<"THU"; break;
case FRY: o<<"FRY"; break;
case SAT: o<<"SAT"; break;
case SUN: o<<"SUN"; break;
}
return o;
};
Run Code Online (Sandbox Code Playgroud)
Main.cpp的
#include <iostream>
#include …Run Code Online (Sandbox Code Playgroud) 我看过这篇文章.但是,我无法理解以下声明.
让我们说我宣布:
Declaration 1: int jimmy [HEIGHT][WIDTH];
Accessing 1: jimmy[n][m]
Declaration 2: int jimmy [HEIGHT * WIDTH];
Accessing 2: jimmy[n*WIDTH+m]
Run Code Online (Sandbox Code Playgroud)
声明1和访问1,声明2和访问2是相同的src.
但是,jimmy [n,m]是什么意思?我写了它给我的代码地址.无法获得任何有用的信息.有人可以说这是什么意思吗?
我已经阅读了很多地方,但我真的无法理解条件中的指定行为.
我理解在赋值中它会计算第一个操作数,丢弃结果,然后计算第二个操作数.
但对于这段代码,它应该做什么?
CPartFile* partfile = (CPartFile*)lParam;
ASSERT( partfile != NULL );
bool bDeleted = false;
if (partfile,bDeleted)
partfile->PerformFileCompleteEnd(wParam);
Run Code Online (Sandbox Code Playgroud)
IF中的partfile是一个不必要的参数,或者它有什么意义?
当我在具有不同条件的for循环中使用两个变量时,我在for循环下面使用的两个条件i<3,j<2总是执行,直到第二个条件失败.
#include<iostream>
#include<conio.h>
using namespace std ;
int main()
{
int i,j ;
for(i=0,j=0;i<3,j<2;i++,j++)
{
cout<<"hello" ;
}
getch() ;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
在该代码中,hello打印2次.为什么?
如果我使用i<3,j<10,"你好"打印10次.我无法理解为什么第一个条件被忽视了.是编译器依赖还是别的?
如果我用||这样的条件替换,那么每件事都能正常工作 (OR)或&&(AND).另一个原因是我无法在for循环中初始化i和j,它向我显示错误,但是当我在C风格中声明变量或在for循环外部声明一个变量时它工作正常,为什么会这样?
我使用的编译器是Orwell Dev C++.
提前致谢.
我已经使用SO一段时间作为参考,但之前从未问过问题.我目前正在大学C++课程中阅读Bjarne Stroutstrup 编程:原理和实践,仅仅是为了我自己的利益,因为我在这里看到了一个真正推荐它的问题的答案.
我们现在正在课堂上覆盖操作员,而我似乎无法理解逗号操作符在语句中的工作方式.一个例子是类的在线部分的示例问题,即使我编写C程序并使用GDB获取结果,我仍然会出错.问题是:
假设在下面的表达式之前x == 16,下面的表达式的值是什么(不一定是x的值)?
x ++,++ x,x + = x
我对正确答案不感兴趣,以至于如何得到正确的答案.我已经阅读了类似问题的几个答案,例如这里的问题,但似乎我错过了当实际上没有分配运算符时这是如何适用的.这跟说的一样吗
int y = (x++, ++x, x+=x);
Run Code Online (Sandbox Code Playgroud)
要么
int y = x++, ++x, x+=x;
Run Code Online (Sandbox Code Playgroud)
还是两个?有人可以解释逗号运算符的工作原理,特别是与没有赋值的语句有关吗?