如果声明了一个对象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 的灵活性.
我刚刚开始学习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显然不使用该标志.
我正在阅读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) 我想创建一个带有可变数量模板参数的函数.稍后使用这些参数,函数应该像这样传递它们的位置:
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)
给定的代码当然不可编译.有没有办法解决它?有没有一种方法可以做到没有可变参数模板而没有太多的代码重复?
我知道在关联容器中更改对象的键是一个可怕的想法,但我想知道标准的确切位置禁止我这样做.考虑:
#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)
我认为上述内容应该是非法的,但我现在正在阅读标准一段时间,而且我找不到任何真正使其成为非法的内容.它在哪里?或者它是否隐藏在未来的缺陷报告中?
以下代码会在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) 请考虑以下代码:
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 ++"标准库"中,是否存在任何"关联"(即"键值")容器/数据结构,它具有按插入顺序保存顺序的能力?
我已经看到了几个这方面的主题,但似乎,大多数在C++ 11之前.
有人建议使用"boost :: multi_index",但是,如果可能的话,我会"宁愿"使用标准的容器/结构.
我看到C++ 11有几个显然是"无序"的关联容器:link.
通过某种方式,这些中的任何一个是"可配置的",这样它们只能按插入顺序排序吗?
谢谢!
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 链接的方法?如果是这样我该如何链接它们?
因为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)