前段时间我读了一篇文章解释了参数依赖查找的几个缺陷,但我再也找不到了.它是关于获取您不应该访问的东西或类似的东西.所以我想我会在这里问:ADL的缺陷是什么?
c++ namespaces overload-resolution argument-dependent-lookup
我不明白FCD第148页上的例子的最后一行(§7.6.1.2/ 4):
const int&& foo();
int i;
struct A { double x; };
const A* a = new A();
decltype(foo()) x1 = i; // type is const int&&
decltype(i) x2; // type is int
decltype(a->x) x3; // type is double
decltype((a->x)) x4 = x3; // type is const double&
Run Code Online (Sandbox Code Playgroud)
为什么括号在这里有所作为?它不应该只是double像上面那样吗?
如果我在常量表达式中除以零,我的玩具编译器会崩溃:
int x = 1 / 0;
Run Code Online (Sandbox Code Playgroud)
C和/或C++标准是否允许这种行为?
c c++ compile-time-constant divide-by-zero constant-expression
将方法标记为public包私有类是否有所不同?
class SomePackagePrivateClass
{
void foo(); // package private method
public void bar(); // public method
}
Run Code Online (Sandbox Code Playgroud)
这之间foo和bar这里的可见度是否存在实际差异?
Locks AutoCloseable?也就是说,而不是:
Lock someLock = new ReentrantLock();
someLock.lock();
try
{
// ...
}
finally
{
someLock.unlock();
}
Run Code Online (Sandbox Code Playgroud)
我能说......么:
try (Lock someLock = new ReentrantLock())
{
someLock.lock();
// ...
}
Run Code Online (Sandbox Code Playgroud)
在Java 7中?
考虑以下代码,这是我实际问题的SSCCE:
#include <iostream>
int roundtrip(int x)
{
return int(float(x));
}
int main()
{
int a = 2147483583;
int b = 2147483584;
std::cout << a << " -> " << roundtrip(a) << '\n';
std::cout << b << " -> " << roundtrip(b) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
我的电脑(Xubuntu 12.04.3 LTS)上的输出是:
2147483583 -> 2147483520
2147483584 -> -2147483648
Run Code Online (Sandbox Code Playgroud)
请注意b往返后正数如何变为负数.这种行为是否明确规定?我原本期望int-to-float round-tripping至少能正确保存符号......
嗯,在ideone上,输出是不同的:
2147483583 -> 2147483520
2147483584 -> 2147483647
Run Code Online (Sandbox Code Playgroud)
g ++团队是否在此期间修复了错误,或者两个输出都完全有效?
在实现移动构造函数和移动赋值运算符时,通常会编写如下代码:
p = other.p;
other.p = 0;
Run Code Online (Sandbox Code Playgroud)
隐式定义的移动操作将使用以下代码实现:
p = std::move(other.p);
Run Code Online (Sandbox Code Playgroud)
这将是错误的,因为移动指针变量并没有将其设置为null.这是为什么?是否有任何情况我们希望移动操作保持原始指针变量不变?
注意:通过"移动",我不只是表示子表达式std::move(other.p),我的意思是整个表达式p = std::move(other.p).那么,为什么没有特殊的语言规则说"如果赋值的右侧是指针xvalue,则在赋值发生后将其设置为null."?
如果我想std::vector用SSE 处理数据,我需要16字节对齐.我怎样才能做到这一点?我需要编写自己的分配器吗?或者默认分配器是否已经与16字节边界对齐?
我可以想到两种方式:
public static IntStream foo(List<Integer> list)
{
return list.stream().mapToInt(Integer::valueOf);
}
public static IntStream bar(List<Integer> list)
{
return list.stream().mapToInt(x -> x);
}
Run Code Online (Sandbox Code Playgroud)
什么是惯用的方式?也许已经有一个库函数完全符合我的要求?
我只是注意到可以final在Scala中声明对象:
final object O
Run Code Online (Sandbox Code Playgroud)
这样做有什么意义?无论如何,无法继承对象:
object A
object B extends A // not found: type A
Run Code Online (Sandbox Code Playgroud)