使用以下代码,我得到一个编译错误C2065 'a': undeclared identifier
(使用Visual Studio 2017):
[] {
auto [a, b] = [] {return std::make_tuple(1, 2); }();
auto r = [&] {return a; }(); //error C2065
}();
Run Code Online (Sandbox Code Playgroud)
但是,以下代码编译:
[] {
int a, b;
std::tie(a, b) = [] {return std::make_tuple(1, 2); }();
auto r = [&] {return a; }();
}();
Run Code Online (Sandbox Code Playgroud)
我以为这两个样本是等价的.它是编译器错误还是我错过了什么?
我想创建一个按钮的IBAction,当你按下它时,应用程序进入后台,同时在特定链接上打开safari(例如"www.google.it")你能帮助我吗?
我有以下makefile:
CXXFLAGS = -std=c++0x -Wall
SRCS = test1.cpp test2.cpp
OBJDIR = object
OBJS = $(SRCS:%.cpp=$(OBJDIR)/%.o)
all: test1
release: clean test1
test1: $(OBJS)
$(CXX) -o $@ $(OBJS)
$(OBJDIR)/%.o: %.cpp
$(CXX) $(CXXFLAGS) -MD -c -o $@ $<
-include $(SRCS:.cpp=.d)
clean:
rm -rf $(OBJDIR)/*
.PHONY: all clean release
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试调用"make -j4 release",那么干净的目标通常会在构建文件的过程中执行,从而导致编译失败.我的问题是如何在开始发布版本之前确保干净的目标已完成.
这是关于gcc 4.9.2和clang 3.5.2存在尖锐分歧的一点.该程序:
template<typename ...Ts>
int foo(int i = 0, Ts &&... args)
{
return i + sizeof...(Ts);
}
int main()
{
return foo();
}
Run Code Online (Sandbox Code Playgroud)
编译没有gcc(-std=c++11 -Wall -pedantic
)的评论.Clang说:
error: missing default argument on parameter 'args'
Run Code Online (Sandbox Code Playgroud)
随着foo
修订为:
template<typename ...Ts>
int foo(int i = 0, Ts &&... args = 0)
{
return i + sizeof...(Ts);
}
Run Code Online (Sandbox Code Playgroud)
clang没有抱怨,但gcc说:
error: parameter pack ‘args’ cannot have a default argument
Run Code Online (Sandbox Code Playgroud)
哪个编译器是对的?
Hell'o我刚刚安装了Visual Studio 2017(企业版).我打开了我在Visual Studio 2015中创建的项目.我的项目使用了windows.h库但是VS2017找不到这个库.怎么修这个?
我正在为包含static_assert
s 的源代码库编写单元测试套件.static_assert
在设计方面,我希望保证这些不会超出他们的期望.所以我希望能够测试它们.
我当然可以添加无法编译的接口单元测试,这些测试会导致static assert
s被各种各样的手段侵犯,并评论或#if 0
全部出来,我个人向用户保证,如果其中任何一个未被注释,那么他们会发现库没有编译.
但这太荒谬了.相反,我想有一些装置,在单元测试套件的上下文中,static_assert
用一个等效激发的运行时异常替换,测试框架可以捕获并报告生效:这段代码将static_assert
在真实中编辑建立.
我是否忽略了一些明显的原因,为什么这会是一个愚蠢的想法?
如果没有,怎么办呢?宏观设备是一种显而易见的方法,我不排除它.但也许,最好是模板专业化或SFINAE方法?
C++标准禁止朋友声明部分特化.(§14.5.3/ 8):
朋友声明不得声明部分专业化.[例:
template<class T> class A { };
class X {
template <class T> friend class A<T*>; //error
};
Run Code Online (Sandbox Code Playgroud)
- 末端示例]
其他问题,例如这个问题,已经收到了援引这一禁令的答案,但我想知道其基本原理.我没有看到它,也无法用我最喜欢的搜索引擎找到它.然而,我可以发现它可以追溯到C++ 98标准,所以大概是基本的和清晰的.有人可以向我解释一下吗?
C++ 11标准的哪一部分(这里是草案标准的副本)需要关联容器,如std :: set,std :: map,std :: unordered_set和std :: unordered_map,以立即调用对象的析构函数从他们身上抹去?
换句话说 - 标准兼容的关联容器是否允许延迟(而不是删除!)他们对密钥的调用和/或它们存储的值和值的析构函数?
如果没有,标准中的哪个部分禁止它?
我问,因为我对关联容器中的延迟删除(有时称为弱删除)感兴趣.这是一种从实际数据保留在原位的结构中"擦除"一个键(或键/值对)的方法,但包含它的节点被标记为死.这些有时被称为墓碑.它们被用于许多关于数据结构的理论论文中,有时在实践中使用.
一个非常简单的例子是在开放寻址的哈希表中删除,有时用逻辑删除来实现.最终重建哈希表时,将调用所有析构函数,并且可以实际最终删除和解除分配逻辑删除的键/值对.
c++ c++-standard-library language-lawyer data-structures c++11
我最近开始使用libclang来解析C文件.我遇到的问题是,显然,libclang在生成AST之前启动预处理器.我想禁止预处理程序运行,而是给出预处理程序指令在文件中的信息......
我使用以下python脚本(cindex.py和libclang)
import codecs
from clang.cindex import *
class SourceFile(object):
def __init__(self, path):
with codecs.open(path, 'r', 'utf-8') as file:
self.file_content = file.read()
index = Index.create()
root_node = index.parse(path)
for included in root_node.get_includes():
print included.include
self.print_declerations(root_node.cursor)
def print_declerations(self, root, recurse=True):
print root.kind.name, root.spelling
if root.kind.is_declaration():
node_def = root.get_definition()
if node_def is not None:
start_offset = node_def.extent.start.offset
end_offset = node_def.extent.end.offset + 1
print self.file_content[start_offset:end_offset], '\n'
if recurse:
for child in root.get_children():
self.print_declerations(child, False)
if __name__ == '__main__':
path = 'Sample.cpp'
print 'Translation …
Run Code Online (Sandbox Code Playgroud) 以下程序使用gcc 4.8.1编译时没有错误或警告
-Wall -std=c++11
:
template<unsigned N>
struct A{};
int main(){
A<1-2> a;
(void)a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用相同选项的clang 3.3会出现此错误:
错误:非类型模板参数的计算结果为-1,不能缩小为'unsigned int'类型[-Wc ++ 11-narrowing]
根据这个问题,看起来gcc的现行政策只是为了缩小标准指示错误的转换,以及clang给出指示错误的警告.但在这种情况下,gcc甚至没有发出警告.
标准第8.5.4/7节(在该问题中再现)中缩小转换错误的例子都没有涵盖非类型模板参数缩小转换的情况,但是§14.3.2/ 5标准说:
对于积分或枚举类型的非类型模板参数,将应用转换常量表达式(5.19)中允许的转换.
并且§5.19/ 3说:
T类型的转换常量表达式是一个文字常量表达式,隐式转换为类型T,其中隐式转换(如果有)在文字常量表达式中是允许的,而隐式转换序列仅包含用户定义的转换,lvalue-to- 除缩小转化次数之外的右值转换(4.1),整数促销(4.5)和积分转换(4.7)(8.5.4)
(我的重点).
在我看来,这意味着即使按照自己的标准,gcc也是错误的,在这种情况下根本没有诊断出变窄的转换.我读得对吗?是否存在基于标准的反驳论点?
我更多的感觉只是好奇心问这个问题.在递归TMP设置中,clang在这种情况下的错误诊断将查明无符号非类型模板参数通过0的错误,而从gcc获得的所有错误都是"超出最大模板实例化深度".