小编jot*_*tik的帖子

数组表示法中的PHP花括号

我只是遇到了一个非常奇怪的PHP代码:

$oink{'pig'} = 1;
var_dump($oink);

$oink{'pig'} = '123123';
echo $oink{'pig'}; /* => 123123 */
echo $oink['pig']; /* => 123123 */
Run Code Online (Sandbox Code Playgroud)

它就像一个数组,但在手册中没有提到.这是什么?

php arrays braces

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

Backbone.js中的控制器

我是Backbone.js的新手.我已经完成了文档.我的问题是控制器概念在哪里出现?换句话说,Backbone.js中的控制器是什么?

我听说路由器是控制器.如果是这样,为什么它被视为控制器?我们可以开发没有路由器的简单基本应用程序吗?在那种情况下,控制器是什么?

model-view-controller backbone.js

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

ptrdiff_t可以表示指向同一数组对象元素的所有指针的减法吗?

对于指针的减法ij同一数组对象元素,[expr.add#5]中的注释读取:

[  注意:如果值i-j不在类型的可表示值范围内std?::?ptrdiff_­t,则行为未定义.-  结束说明 ]

但是给出[support.types.layout#2],其中指出(强调我的):

  1. 该类型ptrdiff_­t是一个实现定义的有符号整数类型,它可以保存数组对象中两个下标的差异,如[expr.add]中所述.

结果是否可能i-j不在可表示的值的范围内ptrdiff_t

PS:如果我的问题是由于我对英语的理解不足造成的,我道歉.

编辑:相关:为什么数组的最大大小"太大"?

c++ arrays pointer-arithmetic language-lawyer ptrdiff-t

32
推荐指数
1
解决办法
569
查看次数

如何检查指针是否指向正确对齐的内存位置?

给定void *一些存储,如何检查它是否指向正确对齐的存储而没有任何实现定义的行为?

我们当然有std::align,但是有更有效的方法吗?

template <std::size_t alignment>
inline bool is_aligned(void * ptr) noexcept {
    std::size_t max = 1u;
    return std::align(alignment, 1u, ptr, max);
}
Run Code Online (Sandbox Code Playgroud)

PS:我需要以兼容C++标准的方式执行此操作,而不依赖于任何特定于平台的(实现定义的)黑客攻击.

PPS:我为我(理解)英语而道歉,而不是我的母语.


EDIT(2018.08.24):从标题中删除了"有效",添加了更多的措辞,强调我不希望任何实现定义或特定于平台的行为.

c++ memory-alignment c++11 c++14 c++17

30
推荐指数
1
解决办法
3397
查看次数

这应该被称为对象切片的一些特殊情况吗?

比方说,我有一个类Derived从类派生Basesizeof(Derived) > sizeof(Base).现在,如果分配一个这样的数组Derived:

Base * myArray = new Derived[42];
Run Code Online (Sandbox Code Playgroud)

然后尝试使用访问n-th对象

doSomethingWithBase(myArray[n]);
Run Code Online (Sandbox Code Playgroud)

然后,由于Base从无效位置访问,这可能(但不总是)导致未定义的行为.

这种编程错误的正确术语是什么?它应该被视为对象切片的情况吗?

c++ arrays inheritance terminology pointer-arithmetic

25
推荐指数
4
解决办法
1391
查看次数

你能将std :: recursive_mutex与std :: condition_variable结合起来吗?

你可以结合std::recursive_mutex使用std::condition_variable,意思是做这样的事情:

std::unique_lock<std::recursive_mutex> lock(some_recursive_mutex)
some_condition_var.wait(lock);
Run Code Online (Sandbox Code Playgroud)

如果不允许,为什么不呢?

我正在使用VC++ 11.

c++ multithreading std c++11 recursive-mutex

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

Evil Firefox错误 - "底层对象不支持参数或操作"

我想弄清楚这里发生了什么.我已经在这几个小时了,似乎无法控制为什么会发生这种情况.

我正在进行一些AJAX调用,并且我一直只在Mac OS X上的Firefox(版本21)中收到此错误.

这是错误:

 "[Exception... "A parameter or an operation is not supported by the underlying object" 
   code: "15" nsresult: "0x8053000f (InvalidAccessError)"  location: 
   "https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js Line: 6"
Run Code Online (Sandbox Code Playgroud)

我正在进行CORS调用,所以我设置了我的AJAX:

$.ajaxSetup({
        crossDomain: true,
        xhrFields: {
            withCredentials: true
        }

    });
Run Code Online (Sandbox Code Playgroud)

并继续打电话.基本上,有没有人有这个错误的经验?我在网上看到一些帖子,但它们似乎都与跨域CSS有关,我没有使用它.

javascript firefox jquery cors

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

用户定义的文字参数不是constexpr?

我正在测试用户定义的文字.我想让_fac返回数字的阶乘.

让它调用一个constexpr函数是有效的,但它不允许我用模板做,因为编译器抱怨参数不是也不可能constexpr.

我对此感到困惑 - 不是文字常量表达式吗?该55_fac始终是一个文字,可以在编译时计算,所以为什么我不能用它作为这样?

第一种方法:

constexpr int factorial_function(int x) {
  return (x > 0) ? x * factorial_function(x - 1) : 1;
}

constexpr int operator "" _fac(unsigned long long x) {
  return factorial_function(x); // this works
}
Run Code Online (Sandbox Code Playgroud)

第二种方法:

template <int N> struct factorial_template {
  static const unsigned int value = N * factorial_template<N - 1>::value;
};
template <> struct factorial_template<0> {
  static const unsigned int value = 1; …
Run Code Online (Sandbox Code Playgroud)

c++ user-defined-literals constexpr c++11

23
推荐指数
2
解决办法
3908
查看次数

C++中的CV限定基类

在重构一些C++ 11代码时,我偶然发现了一件奇怪的事情.也就是说,似乎无法定义CV限定(const,volatileconst volatile)基类,例如:

struct A { int a = 0; };
struct B: A const {}; // Error here with Clang and GCC!
Run Code Online (Sandbox Code Playgroud)

但是,以下编译没有错误:

struct A { int a = 0; };
using AC = A const;
struct B: AC {};      // NO ERROR HERE!? Qualifiers are ignored.
int main() {
  B b;
  b.a = 42;           // NO ERROR modifying a field of const base.
  return b.a;
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 如果有的话,C++标准中禁止定义CV限定的基类?
  2. 为什么第二个例子编译?

PS:由于这是一个language-lawyer问题,请提供C++标准的参考.

c++ language-lawyer c++11

20
推荐指数
2
解决办法
966
查看次数

确定抽象基类的构造函数是否为noexcept?

在C++ 11及更高版本中,如何确定抽象基类的构造函数是noexcept?以下方法不起作用:

#include <new>
#include <type_traits>
#include <utility>

struct Base { Base() noexcept; virtual int f() = 0; };

// static assertion fails, because !std::is_constructible<Base>::value:
static_assert(std::is_nothrow_constructible<Base>::value, "");

// static assertion fails, because !std::is_constructible<Base>::value:
static_assert(std::is_nothrow_default_constructible<Base>::value, "");

// invalid cast to abstract class type 'Base':
static_assert(noexcept(Base()), "");

// invalid new-expression of abstract class type 'Base'
static_assert(noexcept(new (std::declval<void *>()) Base()), "");

// cannot call constructor 'Base::Base' directly:
static_assert(noexcept(Base::Base()), "");

// invalid use of 'Base::Base':
static_assert(noexcept(std::declval<Base &>().Base()), "");
Run Code Online (Sandbox Code Playgroud)

一个简单的用途是:

int g() noexcept; …
Run Code Online (Sandbox Code Playgroud)

c++ noexcept c++11 c++14 c++17

19
推荐指数
2
解决办法
896
查看次数