小编Mik*_*han的帖子

Lambda隐式捕获因结构化绑定声明的变量而失败

使用以下代码,我得到一个编译错误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)

我以为这两个样本是等价的.它是编译器错误还是我错过了什么?

c++ lambda c++17 structured-bindings visual-studio-2017

33
推荐指数
4
解决办法
2931
查看次数

iOS:创建一个链接按钮

我想创建一个按钮的IBAction,当你按下它时,应用程序进入后台,同时在特定链接上打开safari(例如"www.google.it")你能帮助我吗?

xcode mobile-safari ios

24
推荐指数
1
解决办法
4万
查看次数

并行makefile需要依赖顺序

我有以下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",那么干净的目标通常会在构建文件的过程中执行,从而导致编译失败.我的问题是如何在开始发布版本之前确保干净的目标已完成.

makefile gnu-make

24
推荐指数
2
解决办法
2万
查看次数

参数包函数参数可以默认吗?

这是关于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)

哪个编译器是对的?

c++ gcc clang variadic-templates c++11

24
推荐指数
2
解决办法
3644
查看次数

Visual Studio 2017找不到windows.h

Hell'o我刚刚安装了Visual Studio 2017(企业版).我打开了我在Visual Studio 2015中创建的项目.我的项目使用了windows.h库但是VS2017找不到这个库.怎么修这个?

c++ windows

19
推荐指数
4
解决办法
6万
查看次数

如何编写static_assert的runnable测试?

我正在为包含static_asserts 的源代码库编写单元测试套件.static_assert在设计方面,我希望保证这些不会超出他们的期望.所以我希望能够测试它们.

我当然可以添加无法编译的接口单元测试,这些测试会导致static asserts被各种各样的手段侵犯,并评论或#if 0全部出来,我个人向用户保证,如果其中任何一个未被注释,那么他们会发现库没有编译.

但这太荒谬了.相反,我想有一些装置,在单元测试套件的上下文中,static_assert用一个等效激发的运行时异常替换,测试框架可以捕获并报告生效:这段代码将static_assert在真实中编辑建立.

我是否忽略了一些明显的原因,为什么这会是一个愚蠢的想法?

如果没有,怎么办呢?宏观设备是一种显而易见的方法,我不排除它.但也许,最好是模板专业化或SFINAE方法?

unit-testing static-assert c++11

18
推荐指数
1
解决办法
2453
查看次数

为什么标准禁止朋友声明部分专业化?

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++ friend template-specialization

16
推荐指数
1
解决办法
1076
查看次数

C++标准的哪一部分要求set :: erase立即调用析构函数

C++ 11标准的哪一部分(这里是草案标准的副本)需要关联容器,如std :: set,std :: map,std :: unordered_set和std :: unordered_map,以立即调用对象的析构函数从他们身上抹去?

换句话说 - 标准兼容的关联容器是否允许延迟(而不是删除!)他们对密钥的调用和/或它们存储的值和值的析构函数?

如果没有,标准中的哪个部分禁止它?

我问,因为我对关联容器中的延迟删除(有时称为弱删除)感兴趣.这是一种从实际数据保留在原位的结构中"擦除"一个键(或键/值对)的方法,但包含它的节点被标记为死.这些有时被称为墓碑.它们被用于许多关于数据结构的理论论文中,有时在实践中使用.

一个非常简单的例子是在开放寻址的哈希表中删除,有时用逻辑删除来实现.最终重建哈希表时,将调用所有析构函数,并且可以实际最终删除和解除分配逻辑删除的键/值对.

c++ c++-standard-library language-lawyer data-structures c++11

15
推荐指数
1
解决办法
374
查看次数

检索有关预处理器指令的信息

我最近开始使用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)

c++ serialization clang libclang

12
推荐指数
2
解决办法
3117
查看次数

gcc错误的是不能诊断非类型模板参数中的缩小转换吗?

以下程序使用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获得的所有错误都是"超出最大模板实例化深度".

type-conversion narrowing non-type c++11

11
推荐指数
1
解决办法
1111
查看次数