Глобальная константа string& плохо пахнет мне, действительно ли это действительно безопасно?

Хорошо. Поэтому я думаю, что вам просто нужно реализовать разбиение на страницы.

$perPage = 10;

$pageNo = 

Хорошо. Поэтому я думаю, что вам просто нужно реализовать разбиение на страницы.

[110]

Теперь найдите общее количество строк в базе данных.

$totalRows = Get By applying sql query;

$pages = ceil($totalRows/$perPage);    

$offset = ($pageNo - 1) * $perPage + 1

$sql = "SELECT * FROM msgtable WHERE cdate='18/07/2012' LIMIT ".$offset." ,".$perPage
GET['page'];

Теперь найдите общее количество строк в базе данных.

$totalRows = Get By applying sql query;

$pages = ceil($totalRows/$perPage);    

$offset = ($pageNo - 1) * $perPage + 1

$sql = "SELECT * FROM msgtable WHERE cdate='18/07/2012' LIMIT ".$offset." ,".$perPage
11
задан Doug T. 22 June 2009 в 18:12
поделиться

7 ответов

Это полностью законно. Он не будет уничтожен до завершения программы.

РЕДАКТИРОВАТЬ: Да , это гарантировано:

«Все объекты, не имеющие динамического продолжительность хранения, нет потока продолжительность хранения, и не являются локальными имеют статическую продолжительность хранения. В хранение этих предметов должно длиться на время программы (3.6.2, 3.6.3). "

- Рабочий проект 2008 г., Стандарт для языка программирования C ++ , § 3.7.1 стр. 63

Как заметил Мартин, это не Полный ответ. Стандартный проект дальнейших примечаний (§ 12.2, стр. 250-1):

«Временные объекты типа класса создаются в различных контекстах: привязка rvalue к ссылке (8.5.3) [...] Даже когда создание временного объекта избегается (12.8), все семантические ограничения должны соблюдаться, как если бы временный объект был создан. [...] Временные объекты уничтожаются как последний шаг в оценке полное выражение (1.9), которое (лексически) содержит точку, где они были создан. [...] Есть два контекста в котором временные разрушаются в точка, отличная от конца полное выражение. [...] Второй контекст - это когда ссылка привязана к временному. Временное, к которому ссылка связана или временный, то есть полный объект подобъекта, на который указана ссылка привязано сохраняется на протяжении всей жизни ссылка, если не указано иное ниже. "

Я тестировал в g ++, если вам от этого станет легче.;)

14
ответ дан 3 December 2019 в 01:45
поделиться

Да, это допустимо и законно.

const string& SomeConstant = "This is some constant text";

// Is equivalent too:

const string& SomeConstant = std::string("This is some constant text");

Таким образом, вы создаете временный объект.
Этот временный объект привязан к константе &, и, таким образом, его время жизни продлено до срока жизни переменной, с которой он связан (т.е. дольше, чем выражение, в котором он был создан).

Это гарантируется стандартом.

Примечание:

Хотя это законно. Я бы не стал его использовать. Простым решением было бы преобразовать ее в const std :: string.

Использование:

В этой ситуации, поскольку переменная находится в глобальной области видимости, она действительна для всей длины программы. Таким образом, его можно использовать, как только выполнение входит в main (), и к нему нельзя обращаться после завершения выполнения main ().

Хотя технически это может быть доступно до этого, ваше использование его в конструкторах / деструкторах глобальных объектов должно быть ограничено с известной проблемой порядка инициализации глобальных переменных.

Дополнительные мысли:

Это, с другой стороны, не будет страдать от проблемы:

char const* SomeConstant = "This is some constant text";

И может использоваться в любой момент. Просто мысль.

11
ответ дан 3 December 2019 в 01:45
поделиться

Это может быть законно, но все же некрасиво. Оставьте ссылку!

const string SomeConstant = "This is some constant text";
6
ответ дан 3 December 2019 в 01:45
поделиться

Допустимо расширение временной переменной с помощью ссылки const , это используется Александреску ScopeGaurd см. Это превосходное объяснение Херба Саттера под названием Кандидат на «Самую важную const » .

При этом данный конкретный случай является злоупотреблением этой функцией C ++, и ссылку следует удалить, оставив простую константную строку .

2
ответ дан 3 December 2019 в 01:45
поделиться

Это так же законно, как и некрасиво.

4
ответ дан 3 December 2019 в 01:45
поделиться

Объявление его как const (что означает, что его нельзя изменить), а затем создание ссылки, что подразумевает, что кто-то может его изменить, по крайней мере, кажется плохим тоном. К тому же, как я уверен, вы понимаете, глобальные переменные ПЛОХО и редко необходимы.

0
ответ дан 3 December 2019 в 01:45
поделиться

Ладно, ребята поправьте меня, если я схожу с ума, но вот мои выводы, слушая все ваши превосходные ответы:

A) это синтаксически и логически законно, & продлевает время жизни temp / anonymous за пределы уровня выражения до срока жизни ссылки. Я проверил это в VC ++ 7 с помощью:

class A { 
    public: A() { cout << "constructing A" << endl; }
    public: ~A() { cout << "destructing A" << endl; }
};

void Foo()
{
    A();
    cout << "Foo" << endl;
}

void Bar()
{
    const A& someA = A();
    cout << "Bar" << endl;
}

int main()
{
    Foo();    // outputs constructing A, destructing A, Foo
    Bar();    // outputs constructing A, Bar, destructing A
    return 0;
}

B) Хотя это законно, это может привести к некоторой путанице в отношении фактического срока службы, и ссылка в этих случаях не дает вам никаких преимуществ от объявления ее нереференсной, таким образом, ссылки, вероятно, следует избегать и даже может быть лишнее пространство. Поскольку в этом нет никакой пользы, это ненужное запутывание.

Спасибо за все ответы, это было очень интересное обсуждение. Итак, короче и короче: да, это синтаксически законно, нет.

0
ответ дан 3 December 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: