小编Dan*_*rey的帖子

有没有应该避免constexpr的情况,即使它可以使用?

如果声明了一个对象const,则保证其值仅在运行时可用,但如果声明constexpr了该值,则保证该值在编译期间和运行时都可用.因此,如果我有一个在编译期间值可用的对象,是否有任何我不应该声明它的情况constexpr

const int magicValue = 42;      // Does this ever make sense
                                // (using const instead of constexpr)?
Run Code Online (Sandbox Code Playgroud)

对于函数,如果函数可以返回编译期间计算的值,当在编译期间传递带有值的参数时,是否有意义不声明函数constexpr

struct Point { int x; int y; };

Point midPoint(Point p1, Point p2)                       // Does this ever make
{                                                        // sense (not declaring
    return { (p1.x + p2.x) / 2 , (p1.y + p2.y) / 2 };    // the function
}                                                        // constexpr)?
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一情况是当你不想提交能够在使用known-at-compile-time参数调用时计算编译时常量的函数,例如,如果你想保持灵活性改变midPoint实现而不改变其界面(从而可能破坏调用者).例如,您可能希望保留将非constexpr副作用添加到midPoint例如IO 的灵活性.

c++ constexpr c++11

9
推荐指数
1
解决办法
316
查看次数

CMakeLists.txt中的编译器标志不会出现在CMake-Gui或CMakeCache.txt中

我刚刚开始学习CMake并且认为我会理解首先编写的基本过程CMakeLists.txt,然后配置生成CMakeCache.txt并最终生成Makefiles.

但是,当我尝试将它应用于以下CMakeLists.txt时,我没有得到预期的结果,我不确定出了什么问题.CMakeLists.txt的一部分如下所示:

# compiler flags
if (CMAKE_COMPILER_IS_GNUCXX)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fpermissive -Wall -Wformat-security")
    if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-local-typedefs")
    endif()
endif()
Run Code Online (Sandbox Code Playgroud)

由于我使用的是gcc/g ++ 4.7.3,因此应该设置第一个if语句的编译器标志.但是如果我使用CMake-Gui配置它,则没有任何预定义的编译器标志.当我对if语句进行评论并且只保留时,也会发生同样的情况set(CMAKE_CXX_FLAGS ...).在搜索CMakeCache.txt任何-std=c++11标志时,我也没有得到任何结果.

为什么会这样?CMakeLists.txt在不使用它们时在内部指定编译器标志有什么意义?或者我得到了一些完全错误的东西而且他们被使用了,但后来我不知道为什么以及如何检查.

当生成实际(Eclipse CDT)项目make并将其导入Eclipse时,我收到无法解析C++ 11功能的错误消息,__cplusplus宏包含该值,199711因此-std=c++11显然不使用该标志.

c++ gcc cmake c++11

9
推荐指数
2
解决办法
9655
查看次数

JSON Unicode转义序列 - 小写与否?

我正在阅读RFC 4627,我无法弄清楚以下是否是有效的JSON.考虑这个简约的JSON文本:

["\u005c"]
Run Code Online (Sandbox Code Playgroud)

问题是小写 c.

根据RFC 的文本,允许:

任何角色都可能被转义.如果字符在基本多语言平面(U + 0000到U + FFFF)中,那么它可以表示为六个字符的序列:反向固相,后跟小写字母u,后跟四个十六进制数字,编码角色的代码点. 十六进制字母A到F可以是大写或小写. 因此,例如,仅包含单个反向固相字符的字符串可以表示为"\ u005C".

(强调我的)

问题是RFC还包含以下语法:

char = unescaped /
       escape (
           %x22 /          ; "    quotation mark  U+0022
           %x5C /          ; \    reverse solidus U+005C
           %x2F /          ; /    solidus         U+002F
           %x62 /          ; b    backspace       U+0008
           %x66 /          ; f    form feed       U+000C
           %x6E /          ; n    line feed       U+000A
           %x72 /          ; r    carriage return U+000D
           %x74 /          ; t …
Run Code Online (Sandbox Code Playgroud)

unicode json rfc language-lawyer

9
推荐指数
1
解决办法
1064
查看次数

传递可变参数模板参数的位置

我想创建一个带有可变数量模板参数的函数.稍后使用这些参数,函数应该像这样传递它们的位置:

template<typename R, typename Args...>
R myFunction(Data &data, void *function) {
    auto f = (R (*)(Args...))function;
    return f(read<Args1>(data, 1), read<Args2>(data, 2), ...);// <-- This is the problem
}
Run Code Online (Sandbox Code Playgroud)

给定的代码当然不可编译.有没有办法解决它?有没有一种方法可以做到没有可变参数模板而没有太多的代码重复?

c++ variadic-templates c++11

8
推荐指数
1
解决办法
1385
查看次数

为什么不修改关联容器的键?

我知道在关联容器中更改对象的键是一个可怕的想法,但我想知道标准的确切位置禁止我这样做.考虑:

#include <map>
#include <memory>

struct X { int i; };

struct lt
{
  bool operator()( const std::shared_ptr< X >& lhs,
                   const std::shared_ptr< X >& rhs ) const
  {
    return lhs->i < rhs->i;
  }
};

int main()
{
  std::map< std::shared_ptr< X >, int, lt > m;
  auto x = std::make_shared< X >();
  x->i = 1;
  m.insert( std::make_pair( x, 2 ) );

  x->i = 42; // change key wrt the container!
}
Run Code Online (Sandbox Code Playgroud)

我认为上述内容应该是非法的,但我现在正在阅读标准一段时间,而且我找不到任何真正使其成为非法的内容.它在哪里?或者它是否隐藏在未来的缺陷报告中?

c++ std language-lawyer c++11

8
推荐指数
1
解决办法
335
查看次数

关于const抑制的重言式比较的警告?

以下代码会在GCC和Clang上生成警告:

int main() {
  unsigned n = 0;
  return ( n < 0 ) ? 1 : 0;
}
Run Code Online (Sandbox Code Playgroud)

警告是:

$ g++-4.7 -std=c++11 -O3 -Wall -Wextra t.cc -o t
t.cc: In function ‘int main()’:
t.cc:3:16: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
$ clang++-3.2 -std=c++11 -O3 -Wall -Wextra t.cc -o t
t.cc:3:14: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare]
  return ( n < 0 ) ? 1 : 0;
           ~ ^ ~ …
Run Code Online (Sandbox Code Playgroud)

c++ gcc warnings clang

7
推荐指数
2
解决办法
1981
查看次数

我可以重用rvalue引用参数来返回右值引用吗?

请考虑以下代码:

struct MyString
{
  // some ctors

  MyString& operator+=( const MyString& other ); // implemented correctly
};

MyString operator+( const MyString& lhs, const MyString& rhs )
{
  MyString nrv( lhs );
  nrv += rhs;
  return nrv;
}

MyString&& operator+( MyString&& lhs, const MyString& rhs )
{
  lhs += rhs;
  return std::move( lhs ); // return the rvalue reference we received as a parameter!
}
Run Code Online (Sandbox Code Playgroud)

这适用于以下用例

MyString a, b, c; // initialized properly
MyString result = a + b + c; …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading rvalue-reference c++11

7
推荐指数
2
解决办法
1153
查看次数

保持插入顺序的C + 11关联容器?

在c ++"标准库"中,是否存在任何"关联"(即"键值")容器/数据结构,它具有按插入顺序保存顺序的能力?

我已经看到了几个这方面的主题,但似乎,大多数在C++ 11之前.

有人建议使用"boost :: multi_index",但是,如果可能的话,我会"宁愿"使用标准的容器/结构.

我看到C++ 11有几个显然是"无序"的关联容器:link.

通过某种方式,这些中的任何一个是"可配置的",这样它们只能按插入顺序排序吗?

谢谢!

C

c++ containers stl c++11

7
推荐指数
1
解决办法
2173
查看次数

单独文件中的 C++ 类

我正在尝试学习如何在 C++ 中创建类,其中使用头文件、包含类函数定义的 .cpp 文件和主 .cpp 文件。这是我所拥有的(取自示例)

在类.h中

class MyClass
{
public:
  void foo();
  int bar;
};
Run Code Online (Sandbox Code Playgroud)

在类.cpp中

#include "class.h"
using namespace std;
void MyClass::foo()
{
    cout<< "test";
}
Run Code Online (Sandbox Code Playgroud)

在main.cpp中

#include "class.h" 
using namespace std;
int main()
{
  MyClass a;
  a.foo();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译 main.cpp 会导致以下错误: [链接器错误] C:\:(.text+0x16): undefined reference to `MyClass::foo()'collect2: ld returned 1 exit status

我需要编译class.cpp或class.h吗?我是否缺少将 class.h 与 class.cpp 链接的方法?如果是这样我该如何链接它们?

c++ class

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

OCIErrorGet和OCI_ERROR的多个错误处理

因为OCIErrorGet()它记录了它可能返回多个错误,我用它来提取以下方法OCI_SUCCESS_WITH_INFO,但目前不适用于OCI_ERROR:

void check_error( sword status )
{
    switch( status ) {
    case OCI_SUCCESS:
        break;

    case OCI_SUCCESS_WITH_INFO:
        {
           ub4 recordno = 1;
           while( status != OCI_NO_DATA ) {
              sb4 errcode = 0;
              text errbuf[ 1024 ];
              status = ::OCIErrorGet( m_err, recordno, (text*)NULL, &errcode, errbuf, sizeof( errbuf ), OCI_HTYPE_ERROR );
              if( status == OCI_SUCCESS ) {
                 std::cout << "oracle info: " << (const char*)errbuf << std::endl;
              }
              else {
                 assert( status == OCI_NO_DATA );
              }
              ++recordno; …
Run Code Online (Sandbox Code Playgroud)

c++ oracle oracle-call-interface

6
推荐指数
1
解决办法
1399
查看次数