前段时间我读过一篇关于CLR的文章,其中作者表明,如果一个项目是在DEBUG模式下编译的,那么在每个操作符出现一个NOP命令之前,就可以调试一个代码.不过,今天我发现我们也可以在发布模式下调试......请帮助理解差异.
template <typename T, typename T::tag...>
void f() {}
struct Tagged { using tag = struct{}; };
struct Untagged {};
void test() {
f<Tagged>();
f<Untagged>(); // fails
}
Run Code Online (Sandbox Code Playgroud)
此代码编译在gcc 8.1上,而clang 6.0和MSVC 19失败.请注意,--std=c++14它传递给所有三个.
Clang的错误:
:9:5:错误:调用'f'没有匹配函数
Run Code Online (Sandbox Code Playgroud)f<Untagged>(); ^~~~~~~~~~~:2:6:注意:候选模板被忽略:替换失败[T = Untagged]:'Untagged'中没有名为'tag'的类型
void f(){}
Run Code Online (Sandbox Code Playgroud)^
MSVC的错误:
(9):错误C2672:'f':找不到匹配的重载函数
(9):错误C2893:无法专门化函数模板'void f(void)'
(9):注意:使用以下模板参数:
(9):注意:'T =未标记'
(9):注意:'__ formal = {default_valueAttribute}'
但是,如果我们评论有问题的部分:
template <typename T, typename T::tag...>
void f() {}
struct Tagged { using tag = struct{}; };
struct Untagged {};
void test() {
f<Tagged>();
//f<Untagged>();
} …Run Code Online (Sandbox Code Playgroud) JNI参考说明了这一点
"本地引用在本机方法调用的持续时间内有效.它们在本机方法返回后自动释放.
资料来源:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#global_local
我有点迷失在这里.根据上面,我必须显式调用NewGlobalRef并传递从调用NewObject的对象返回的对象.我尝试了这个,似乎当GC启动时,它不会收集我的引用(就像仍然保留它们的东西).考虑以下项目: Main.java:
package lv.example;
import java.io.IOException;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
ArrayList<Object> store = new ArrayList<Object>();
while(true) {
Object d = null;
try {
int c = System.in.read();
d = Dummy.getWeakGlobalRef();
if(c == 'c')
store.clear();
store.add(d);
System.out.println(d);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Dummy.java:
package lv.example;
class Dummy {
static {
System.loadLibrary("dummy");
}
native static Dummy getLocalRef();
native …Run Code Online (Sandbox Code Playgroud) 考虑这样的代码:
std::vector<int> vec { 1, 2, 3 };
auto addr = &*vec.end();
Run Code Online (Sandbox Code Playgroud)
或简化:
int* ptr = 0;
auto addr = &*ptr;
Run Code Online (Sandbox Code Playgroud)
显然auto val = *ptr;会出现段错误.因此&*ptr,不会以相同的方式访问内存.为什么会这样?标准中是否有特定条目?