我不是在反对下面代码的结果,因为我认为假定一个const左值引用和一个右值引用都是正确的,它们都延长了从函数返回的临时值的生命周期.让我感到惊讶的是标准中的这一段,似乎相反:
12.2p5(强调我的):
第二个上下文是引用绑定到临时的.绑定引用的临时对象或绑定引用的子对象的完整对象的临时对象在引用的生命周期内持续存在,除了:
- ...
- ...
- 函数返回语句(6.6.3)中返回值临时绑定的生命周期未扩展; 临时在return语句中的full-expression结束时被销毁.
示例代码:
#include <iostream>
struct A{ A() : i(2) {} int i;};
A f() { A a; return a; }
int main()
{
A&& a1 = f();
std::cout << a1.i << '\n';
const A& a2 = f();
std::cout << a2.i << '\n';
}
Run Code Online (Sandbox Code Playgroud) 在带有阴影的按钮上分层文件输入字段,我发现自己想要在输入上使用110%的高度,这样它也可以覆盖阴影部分.
它运作得相当好.
但是:根据标准,这是正确,合法和有效的CSS吗?
当我遇到一堆看起来像这样的结构时,我正在挖掘一些与PIC单片机相关的headder文件:
typedef struct tagPORTDBITS {
unsigned RD0:1;
unsigned RD1:1;
unsigned RD2:1;
unsigned RD3:1;
unsigned RD4:1;
unsigned RD5:1;
unsigned RD6:1;
unsigned RD7:1;
unsigned RD8:1;
unsigned RD9:1;
unsigned RD10:1;
unsigned RD11:1;
unsigned RD12:1;
unsigned RD13:1;
unsigned RD14:1;
unsigned RD15:1;
} PORTDBITS;
Run Code Online (Sandbox Code Playgroud)
这是标准C吗?我无法找到任何其他类似的东西,即变量定义后的":1"
我假设所有元素都代表位,那么这是Microchip对C编译器的补充,以使嵌入式程序员更容易吗?
我试图理解,为什么GCC f(char, A<C, 5> &var)在下面的代码中选择重载解析:
template <class C, int N> struct A { };
template <class C> struct A<C, 8> { static_assert(sizeof(C) > 8, "Assertion in A<C,8>"); };
template <class C> struct A<C, 5> { static_assert(sizeof(C) < 8, "Assertion in A<C,5>"); operator A<C,8>&(); };
template <class C> void f(double, A<C,8> &var);
template <class C> void f(char, A<C,5> &var);
int main(void)
{
A<int, 5> a;
f(4., a);
}
Run Code Online (Sandbox Code Playgroud)
有两种可用的重载:
template <class C> void f(double, A<C,8> &var);
Run Code Online (Sandbox Code Playgroud)
4.完全匹配double(不需要隐式转换),但第二个参数需要用户定义的转换.所以这个过载: …
我想知道这是不是很好的做法:
我有一个接受参数和回调块的方法,让我们说一下以下内容:
-(void)loginWithUsername:(NSString *)username andPassword:(NSString *)password withCompletion:(LoginManagerCompletionBlock)completionHandler;
Run Code Online (Sandbox Code Playgroud)
现在在这种特定情况下,没有完成处理程序就没有用于调用此方法,因为它触发了对登录Web服务的冗余调用(同样,它不会改变任何状态 - 不是客户端也不是服务器端).我想通过主动强制要求传递完成块以便进行此Web服务调用来避免这些情况.我有点认为这是Objective C协议中的"@required"方法.所以我的问题是:
谢谢
var Obj = new Object;
Run Code Online (Sandbox Code Playgroud)
要么
var Obj = new Object();
Run Code Online (Sandbox Code Playgroud)
当我在控制台中尝试两个代码时都有效.哪种格式正确.我在哪里可以找到这些JS标准.
clang 3.4接受以下代码
struct A
{
int a[2] = {1, 2};
};
Run Code Online (Sandbox Code Playgroud)
但是,vc ++ 2014 CTP拒绝它并显示错误消息:
error C2536: 'A::A::a': cannot specify explicit initializer for arrays
哪个编译器正确?
如果你看一下标准,你可以看到它们确实包括对C11和C99的支持.但是如果你试图在没有指定标准的情况下编译代码,GCC仍然会使用C89/C90.
这背后的原因是什么?
我的意思是在其他语言中,通常每当发布新标准时,编译器将被设置为遵循新规则.
为什么这种行为与gcc编译器不一样?
在以下代码中:
A & getDataA() ;
B & getDataB() ;
void foo()
{
getDataA() = getDataB() ;
}
Run Code Online (Sandbox Code Playgroud)
是getDataA()保证在之前或之后进行评估getDataB(),还是评估两个操作数相对于另一个未经测序的操作数?
注意:我对引用该标准的答案感兴趣.
.
我试图理解标准来找到答案,这是我研究的结果.我的理解是对两个操作数的评估是不合理的.
但是......(每个引用来自C++ 14 draft n3797,5.17 [expr.ass]):
赋值运算符(=)和复合赋值运算符都是从右到左分组.
这意味着表达式a = b = c ;确实如此a = (b = c) ;.
在所有情况下,在右和左操作数的值计算之后,以及在赋值表达式的值计算之前,对赋值进行排序.
第一部分说,a = b ;实际的分配将在之后进行a并b进行评估.第二部分让我感到困惑:我可以理解它operator +=(或另一个复合赋值运算符),但我无法理解operator =.
看一下章节的开头(5 Expression [expr]),我读到:
重载运算符的使用将转换为函数调用,如13.5中所述.重载运算符遵循第5章中指定的语法规则,但操作数类型,值类别和评估顺序的要求将替换为函数调用的规则.
这就是让我相信两个操作数的评估是无法排序的(函数参数的评估是无序的,除非我遗漏了一些内容),用于内置A或B不内置的情况.
但是,在上述情况下,A和B可能int,所以内置的 …
说我有以下......
double d = 1.6;
int q = ( ( int ) d );
Run Code Online (Sandbox Code Playgroud)
这总是会根据Java标准丢弃正好小数点,还是可以根据标准(或多或少存在)向上或向下舍入?
standards ×10
c++ ×4
c++11 ×3
c ×2
gcc ×2
c++14 ×1
css ×1
html ×1
java ×1
java-8 ×1
javascript ×1
object ×1
objective-c ×1
percentage ×1
pic ×1
struct ×1
typedef ×1
visual-c++ ×1